Сообщение об ошибке

  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 126 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 131 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_process() (строка 231 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).

PrestaShop 1.5 и 903+ запросов к базе данных при создании интернет-магазина с высокой нагрузкой(Не сложная но эффективная оптимизация о которой не пишут)

test

PrestaShop
Понравилась CMS PrestaShop, в ней есть практически все что нужно для создания интернет-магазина.

Введение

Собственно задача у меня сделать магазин, в котором более 50 тыс. видов товара. Бывшая CMS WebAsyst за сроком годности и ввиду платности отпадает. Как дополнение к выше сказанному - несколько лет работы разных фрилансеров сделали систему крайне тяжелой для поддержки. Как важное условие, CMS должна быть совместима с импортом-экспортом товаров в/из программ разработчика Elbuz Content Creator и Price List Importer(общение с их тех. поддержкой сплошной вынос мозга). Но все это напоролось на крайне медленную производительность сайта. Повторюсь, количество видов товара более 50 тыс. Включение отладки в /config/defines.inc.php:

define('_PS_DEBUG_PROFILING_', true);

Отладка(внизу сайта) показала наличие 903 запросов. И тут я решился взяться за поиски.
Первым на что пал выбор - блок категорий. Ввиду большого уровня вложенности, количество запросов там вполне могло быть достаточно высоким. Но нет... Первое место достается не ему. Блок поставщиков тоже после отключения не снял нагрузки. Ни просмотренные товары, ни другие модули. Но есть несколько кандидатов.

Главное горизонтальное меню(/modules/blocktopmenu)

При 301 категории - приблизительно 600+ запросов к базе данных.

Подозрение у меня немного раньше пало на модуль горизонтального меню, но эту версию я решил оставить напоследок. Тем более что отладчик показывал:

1270.616 ms SELECT SQL_NO_CACHE p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity, pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, MAX(image_shop.`id_image`) id_image, il.`legend`, m.`name` AS manufacturer_name, DATEDIFF( product_shop.`date_add`, DATE_SUB( NOW(), INTERVAL 20 DAY ) ) > 0 AS new, MAX(product_attribute_shop.id_product_attribute) id_product_attribute FROM `pref_product` p INNER JOIN pref_product_shop product_shop ON (product_shop.id_product = p.id_product AND product_shop.id_shop = 1) LEFT JOIN `pref_product_lang` `pl` ON p.`id_product` = pl.`id_product` AND pl.`id_lang` = 3 AND pl.id_shop = 1 LEFT JOIN `pref_image` `i` ON i.`id_product` = p.`id_product` LEFT JOIN pref_image_shop image_shop ON (image_shop.id_image = i.id_image AND image_shop.id_shop = 1 AND image_shop.cover=1) LEFT JOIN `pref_image_lang` `il` ON i.`id_image` = il.`id_image` AND il.`id_lang` = 3 LEFT JOIN `pref_manufacturer` `m` ON m.`id_manufacturer` = p.`id_manufacturer` LEFT OUTER JOIN `pref_product_attribute` pa ON p.`id_product` = pa.`id_product` LEFT JOIN pref_product_attribute_shop product_attribute_shop ON (product_attribute_shop.id_product_attribute = pa.id_product_attribute AND product_attribute_shop.id_shop = 1 AND product_attribute_shop.default_on = 1) LEFT JOIN pref_stock_available stock ON (stock.id_product = p.id_product AND stock.id_product_attribute = IFNULL(`product_attribute_shop`.id_product_attribute, 0) AND stock.id_shop = 1 ) WHERE (product_shop.`active` = 1) AND (product_shop.`visibility` IN ("both", "catalog")) AND ( DATEDIFF( product_shop.`date_add`, DATE_SUB( NOW(), INTERVAL 20 DAY ) ) > 0) AND (p.`id_product` IN ( SELECT cp.`id_product` FROM `pref_category_group` cg LEFT JOIN `pref_category_product` cp ON (cp.`id_category` = cg.`id_category`) WHERE cg.`id_group` = 1)) GROUP BY product_shop.id_product ORDER BY p.`date_add` DESC LIMIT 5
in /var/www/****/classes/Product.php:2052
USING FILESORT - 50790495525 rows browsed

Как видно, основная нагрузка падает на файл /var/www/****/classes/Product.php:2052
Тяжело подумать что все это из-за верхнего меню. Отключаю модуль и вижу картину:
Stopwatch (with SQL_NO_CACHE) (total = 33)
То есть всего на страницу приходится 33 запроса.

Как итог, виновник 600+(Еще больше 200+ запросов Блок категорий) запросов к базе данных модуль "Главное горизонтальное меню".(/modules/blocktopmenu)

Вся загвоздка по всей видимости в том, что так как категорий товара достаточно много, вызов категорий и подкатегорий(до 5 уровней вложенности) и вызывает столь лавинообразное количество запросов.

Как вариант, чтобы не отключать модуль, достаточно его настроить, отключив категории товара. К примеру разместив там только ссылки на страницы(О магазине, Доставка, и им подобные).

Блок категорий(/modules/blockcategories)

При включении, с наличием 301 категории модуль показывает результат в районе 260+ запросов к базе данных.

Если вас устраивает такое решение, в 260+ запросов, это ваш личный выбор. Вполне хороший вариант сделать запрос к базе данных с 5-6 джоинами. Можно в настройках модуля уменьшить глубину вложенности. При 1 в меню вообще все отсутствует. По умолчанию стоит 4 уровня вложенности.

Самый оптимальный вариант - написать свой модуль вывода категорий, имеющий один запрос с несколькими уровнями вложенности.

Вывод

Не знаю, может по мнению разработчиков данных модулей на 300 категорий дополнительных 300-600 запросов на страницу это нормально, мое же мнение что такой нагрузки хватит чтобы перевести систему из разряда "Для совсем малых магазинов" до разряда "Для достаточно крупных магазинов". Путем легких манипуляций мы уменьшили нагрузку в несколько десятков раз.

Я не задавался целью найти проблему(ы) и сделать все идеально. Для текущей моей задачи настройки горизонтального меню и написания замены Блока категорий вполне достаточно. На этом все.

Категория: 
Share/Save

Делитесь с друзьями в социальных сетях! Оставляйте комментарии!

Share/Save

Это Вам так же может быть интересно!