0 Пользователей и 1 Гость просматривают эту тему.
  • 30 Ответов
  • 7790 Просмотров
*

KVT

  • Захожу иногда
  • 98
  • 9 / 0
Сегодня обнаружилась проблема функционирования каталога Zoo на объемах более 1000 позиций (сейчас в каталоге более 6 тыс. позиций, а будет около 18 тыс.). Если коротко, то на больших объемах он начинает усиленно грузить сервер и возрастает нагрузка на сервер БД. В результате тестирования выяснилось, какой из запросов является виновником.

В классе ItemModelItems есть метод getTotal, который вычисляет количество записей просто выбирая все записи из БД, при чем с JOIN'ами и группировками. А потом смотрит сколько выбрано, вместо того, чтобы правильно построить запрос на вычисление количества записей.

Исправленный вариант этого метода должен выглядеть так:
Код
  /**
   * Method to get the total number of items
   *
   * @access public
   * @return integer
   */
  function getTotal() {
    if (empty($this->_total)) {
      $db          =& JFactory::getDBO();
      $table       =& $this->getTable($this->_table);
      $where       =  $this->_buildContentWhere();

      // parse catalog/category
      if (strpos($this->getState('filter_category_id'), ':')) {
        list($catalog_id, $category_id) = explode(':', $this->getState('filter_category_id'), 2);
      } else {
        list($catalog_id, $category_id) = array(0, 0);
      }
      
      $query = 'SELECT count(*) FROM '.$table->getTableName().' AS a'
        .(($catalog_id > 0 || $category_id > 0)? ' JOIN '.ZOO_TABLE_CATEGORY_ITEM.' AS ci ON a.id = ci.item_id' : '')
        .$where;

      $db->setQuery($query);
      $this->_total = $db->loadResult();
    }
    
    return $this->_total;
  }

Сервер передумал загружать мои файлы, сославшись на нехватку места, т.ч. оставляю ссылку для скачивания хака: http://www.cms-service.ru/file-11.html
« Последнее редактирование: 11.02.2010, 18:09:27 от KVT »
С уважением,
Константин
http://www.cms-service.ru/
*

KVT

  • Захожу иногда
  • 98
  • 9 / 0
Выяснилось еще одно узкое место: при выборке записей из базы для отображения на фронтальной части сайта каталог выбирает все записи заданного каталога/категории и потом делает вырезку нужного количества из массива результатов. При больших объемах PHP расходует всю доступную память и, как следствие - фатальная ошибка. Кроме того, это приводит к трениям с хостером при использовании виртуального хостинга.

Исправляется следующим образом:

в класс TableItem (файл /administrator/components/com_zoo/tables/item.php) добавляется метод getCountFromCategory
Код
	function getCountFromCategory($catalog_id, $category_id, $published = false, $access_id = false){

$date =& JFactory::getDate();
$now  = $this->_db->Quote($date->toMySQL());
$null = $this->_db->Quote($this->_db->getNullDate());

$query = "SELECT count(*)"
." FROM ".$this->getTableName()." AS a"
." LEFT JOIN ".ZOO_TABLE_CATEGORY_ITEM." AS b ON a.id = b.item_id"
." WHERE b.catalog_id = ".(int) $catalog_id
." AND b.category_id ".(is_array($category_id)? " IN (".implode(",", $category_id).")" : " = ".(int) $category_id)
.($published == true ? " AND a.state = 1" : "")
.($access_id !== false ? " AND a.access <= ".(int) $access_id : "")
." AND (a.publish_up = ".$null." OR a.publish_up <= ".$now.")"
." AND (a.publish_down = ".$null." OR a.publish_down >= ".$now.")"
;

$this->_db->setQuery($query);
return $this->_db->loadResult();
}

в классе ZooModelCategory (файл /components/com_zoo/models/category.php) метод getItems должен выглядеть так:
Код
	function getItems() {
if (empty($this->items)) {

// set order
$orders = array('date' => 'a.created ASC', 'rdate' => 'a.created DESC',
'alpha' => 'a.name ASC', 'ralpha' => 'a.name DESC',
'hits' => 'a.hits DESC', 'rhits' => 'a.hits ASC',
'ordering' => 'a.ordering ASC', 'rordering' => 'a.ordering DESC');
$order = isset($orders[$this->item_order])? $orders[$this->item_order] : '';

// get items
$table =& JTable::getInstance('item', 'Table');
$table->setCache($this->cache);
$itemsCount = $table->getCountFromCategory($this->catalog_id, $this->category_id, true, $this->user->get('aid', 0));

// set pagination
$this->pagination = new YPagination('page', $itemsCount, $this->page, $this->items_per_page);
$this->pagination->setShowAll($this->items_per_page == 0);

// slice out items
if ($this->pagination->getShowAll()) {
$this->items = $table->getFromCategory($this->catalog_id, $this->category_id, true, $this->user->get('aid', 0), $order, 0, $itemsCount);
} else {
$this->items = $table->getFromCategory($this->catalog_id, $this->category_id, true, $this->user->get('aid', 0), $order, $this->pagination->limitStart(), $this->items_per_page);
}
}

return $this->items;
}
« Последнее редактирование: 27.01.2010, 11:33:35 от KVT »
С уважением,
Константин
http://www.cms-service.ru/
*

snowindy

  • Осваиваюсь на форуме
  • 30
  • 3 / 0
Как сейчас ведет себя производительность? С Вашими модификациями ушли все проблемы, или все равно медленновато?
*

KVT

  • Захожу иногда
  • 98
  • 9 / 0
Проблемы ушли, что не может не радовать :-)
С уважением,
Константин
http://www.cms-service.ru/
*

CTPAHHuK

  • Администратор
  • 75
  • 37 / 0
А можно попросить приаттачить исправленные файлики. (Zoo 1.07)
*

KVT

  • Захожу иногда
  • 98
  • 9 / 0
Я бы рад приатачить, но при попытке это сделать форум выдает "Папка upload заполнена. Попробуйте файл меньшего размера или свяжитесь с Администратором."
С уважением,
Константин
http://www.cms-service.ru/
*

KVT

  • Захожу иногда
  • 98
  • 9 / 0
Ссылочка: http://www.cms-service.ru/file-11.html
В архиве совмещенный хак из двух: описанного в данном топике и этого
С уважением,
Константин
http://www.cms-service.ru/
*

yrygvay

  • Завсегдатай
  • 1291
  • 36 / 3
Просьба есть у меня к Гуру ZOO ... ребят вот я смотрю у вас каталоги по 5-19 тыс позиций.

Подскажите как такой же каталог организовать на ZOO, не могу найти мануал как загрузить позиции из прайса!
Смотрю....
*

delames

  • Захожу иногда
  • 141
  • 10 / 0
  • Решаю программные вопросы за $ - Обращайтесь!
Вручную. Либо создать тип а потом добавить в базу напрямую через скрипт, который видимо тебе придется написать самому. ))
*

yrygvay

  • Завсегдатай
  • 1291
  • 36 / 3
Как же всё замечательно! Получается что бы сделать наполнение 10 тыс позициями проще это сделать в VM, но он же при такой загрузке будет вешать базу!!
парадокс!

Какой выход интересно есть?

Может KVT подскажет.
По его сообщению у него порядка 18 тыс позиций... Не верится что всё в ручную делали!
Смотрю....
*

delames

  • Захожу иногда
  • 141
  • 10 / 0
  • Решаю программные вопросы за $ - Обращайтесь!
В твоем случае с сотнями позиций нужно писать скрипт импорта с учетом правил _value _params элементов.
*

voland

  • Легенда
  • 9990
  • 549 / 107
  • Эта строка съедает место на вашем мониторе
Любопытненько. А хак на getTotal при этом по прежнему возвращает сумму элементов по всем подкаталогам или все таки кол-во элементов (в случае когда исползуется мультикагеройность это разные вещи)
*

Alldar

  • Завсегдатай
  • 1451
  • 188 / 1
Какой выход интересно есть?
Использовать другой каталог? не?
Пожалуйста не дублируйте сообщения в личку/skype/google+. Все вопросы задавайте на форуме! Спасибо!

Клуб шаблонов для Joomla - NorrTheme
*

voland

  • Легенда
  • 9990
  • 549 / 107
  • Эта строка съедает место на вашем мониторе
Как же всё замечательно! Получается что бы сделать наполнение 10 тыс позициями проще это сделать в VM, но он же при такой загрузке будет вешать базу!!
парадокс!

Какой выход интересно есть?

Может KVT подскажет.
По его сообщению у него порядка 18 тыс позиций... Не верится что всё в ручную делали!
Писать скрипт экспорта - у меня тоже есть каталог на 4000 позиций - никаких проблем, но решение бесплатно думаю никто не выложит, хотя бы потому, что структура у всех разная, а писать универсальный - очень трудоемко
*

delames

  • Захожу иногда
  • 141
  • 10 / 0
  • Решаю программные вопросы за $ - Обращайтесь!
хотя бы потому, что структура у всех разная, а писать универсальный - очень трудоемко

Так и есть.. Но, если у тебя просто прайс аля наименование - цена то тут проблем конечно нет
*

yrygvay

  • Завсегдатай
  • 1291
  • 36 / 3
А кто может вызваться за написание скрипта!?

И какой диапазон цен на эту работу?
Смотрю....
*

userxp

  • Живу я здесь
  • 2019
  • 403 / 6
  • Злой и ужасный бармалей
я сомневаюсь, что кто-то напишет скрипт, тем более, что работа скорее всего разовая (да еще и при таком кол-ве)
тут будет скорее некий промежуточный вариант - сделать все на локалке, импортнуть туда данные и потом их через pma кусками залить. имхо так будет надежнее.
в зависимости от сложности структуры это может занять 2-5 дней.
по времени считай - 10 часов день = 100 у.е.. 3 дня - соотв. 300

а можно и за пару часов сделать.. все зависит от исходной структуры и от той КУДА надо залить
потом еще учесть существующие данные.

может там вообще все можно руками через pma всунуть и это окажется быстрее ;D
Как правильно задавать вопрос службе технической поддержки  yes!
SGA CM 7.2.0 RC0 KANG Build GWK74 + s95allinonescript + CWM 5.0.2.6 + Modem XWKT3
*

voland

  • Легенда
  • 9990
  • 549 / 107
  • Эта строка съедает место на вашем мониторе
Есть наработки, могу сделать экспорт, но как и сказано выше - это разовая работа - то есть либо экспорт один раз либо компонент под фиксированную структура каталога - порядок цен примерно от 100$ и выше, в зависимости от структуры
*

delames

  • Захожу иногда
  • 141
  • 10 / 0
  • Решаю программные вопросы за $ - Обращайтесь!
А кто может вызваться за написание скрипта!?

И какой диапазон цен на эту работу?

Выложи тут часть прайса.. В том виде в котором он есть сейчас. И немного опиши что хочешь получить в результате т.е. тупо как в прайсе, или + какие-то нюансы
*

KVT

  • Захожу иногда
  • 98
  • 9 / 0
Может KVT подскажет.
По его сообщению у него порядка 18 тыс позиций... Не верится что всё в ручную делали!
Подскажу. Писали специальную обработку в 1С, которая напрямую в базу сайта лезла через SSH тунель и по таблицам ZOO все распихивала. Обработка весьма специфичная, под конкретную, сильно кастомищированную конфигурацию 1С и под нашу конкретную структуру каталога. Был вариант сделать компонент на PHP, который бы импортировал из XML, но PHP банально не хватает времени на такой большой объем данных, что приводило к остановке скрипта по таймауту, да и удобнее для заказчика это все делать прямо из 1С.
С уважением,
Константин
http://www.cms-service.ru/
*

KVT

  • Захожу иногда
  • 98
  • 9 / 0
Любопытненько. А хак на getTotal при этом по прежнему возвращает сумму элементов по всем подкаталогам или все таки кол-во элементов (в случае когда исползуется мультикагеройность это разные вещи)
Возвращает количество элементов в выбранной категории ибо это правильно.
С уважением,
Константин
http://www.cms-service.ru/
*

KVT

  • Захожу иногда
  • 98
  • 9 / 0
по времени считай - 10 часов день = 100 у.е.. 3 дня - соотв. 300
Это Вы как-то поскромничали, у нас час работы программиста стоит 750 руб и это считается верхний предел нижнего ценового сегмента.
С уважением,
Константин
http://www.cms-service.ru/
*

userxp

  • Живу я здесь
  • 2019
  • 403 / 6
  • Злой и ужасный бармалей
Был вариант сделать компонент на PHP, который бы импортировал из XML, но PHP банально не хватает времени на такой большой объем данных, что приводило к остановке скрипта по таймауту,
слабаки ;D за что у вас платят 200 баксов в день?
эта "проблема" обходится. не просто, но обходится
Как правильно задавать вопрос службе технической поддержки  yes!
SGA CM 7.2.0 RC0 KANG Build GWK74 + s95allinonescript + CWM 5.0.2.6 + Modem XWKT3
*

KVT

  • Захожу иногда
  • 98
  • 9 / 0
А я сказал что не обходится?  ;D
Еще как обходится, но клиенту проще в привычной среде нажать пару кнопок, чем экспортировать из 1С, а потом лезть в админку сайта и там импортировать все это дело :-)
С уважением,
Константин
http://www.cms-service.ru/
*

userxp

  • Живу я здесь
  • 2019
  • 403 / 6
  • Злой и ужасный бармалей
я имел ввиду, одной кнопкой обходится.
Как правильно задавать вопрос службе технической поддержки  yes!
SGA CM 7.2.0 RC0 KANG Build GWK74 + s95allinonescript + CWM 5.0.2.6 + Modem XWKT3
*

KVT

  • Захожу иногда
  • 98
  • 9 / 0
Спорить не буду ибо возможны варианты.
С уважением,
Константин
http://www.cms-service.ru/
*

Disraeli

  • Новичок
  • 8
  • 0 / 0
Подскажите пожалуйста, можно ли в zoo подключать несколько каталогов одновременно? в видео уроке подключали всего один каталог "домофоны и камеры", а мне нужно сделать еще несколько и чтобы все одновременно отображалось. Но в zoo menu можно выбрать всего один каталог для отображения. как можно решить этот вопрос?   !
*

delames

  • Захожу иногда
  • 141
  • 10 / 0
  • Решаю программные вопросы за $ - Обращайтесь!
Подскажите пожалуйста, можно ли в zoo подключать несколько каталогов одновременно? в видео уроке подключали всего один каталог "домофоны и камеры", а мне нужно сделать еще несколько и чтобы все одновременно отображалось. Но в zoo menu можно выбрать всего один каталог для отображения. как можно решить этот вопрос?   !

Подкатегориями  ^-^
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Сортировка каталога по комментариям и рейтингу.

Автор panasenko

Ответов: 4
Просмотров: 1794
Последний ответ 15.10.2013, 01:51:42
от шдш
Показ каталога ZOO. Позиции.

Автор diktator1

Ответов: 10
Просмотров: 6110
Последний ответ 31.05.2011, 07:44:02
от Iyulka
проблема с апгрейдом с 1.1.17 до zoo 2.2.3

Автор LOON

Ответов: 0
Просмотров: 965
Последний ответ 22.11.2010, 17:43:07
от LOON
Проблема адресации в нескольких каталогах

Автор sdenisv

Ответов: 3
Просмотров: 1078
Последний ответ 04.11.2010, 00:03:51
от sdenisv
Проблема с Read More

Автор studio

Ответов: 10
Просмотров: 7053
Последний ответ 13.10.2010, 21:01:02
от sergeeva