Prestashop из коробки, ужас летящий на крыльях ночи и оптимизация.

che02

Создатель
Регистрация
12 Мар 2007
Сообщения
18
Реакции
6
Немного сумбурно - просто нахожусь под впечатлением от своего первого магазина на Prest'e :)

Короче поставил я свой первый магазин на Prestashop (1.7.1.2). Тему купил на themeforest.
Всё работает, всё хорошо, тема красивая - но ... всё это работает как то медленно, не то что бы слишком, но ощутимо тормозит.
Сервер у меня хороший, VPS. Аналогичные магазины, с похожим дизайном, на самописной CMS, работают гораздо быстрее.

И решил я оптимизировать работу магазина.
Везде включил кеш (КОМБИНИРОВАНИЕ, КОМПРЕССИЯ И КЕШИРОВАНИЕ, SMARTY Кеш), для теста отключил ДОПОЛНИТЕЛЬНЫЕ ВОЗМОЖНОСТИ (Комбинации, Характеристики, Группы клиентов). Включил GZIP.
всё равно тормозит. Особенно первая страничка.

И решил я посмотреть поглубже, что именно тормозит то.

Погуглил и нашел директиву _PS_DEBUG_PROFILING_ которая включает режим отладки.
Для теста отключил кеш.
Включил директиву и .... и просто ох....нел.

Первая страничка сайта, та что больше всего тормозит, угадайте сколько там SQL запросов - тадааааам 702 SQL запроса.
Это вообще как так то а ... ну минуту другую побегал я по комнате, поудивлялся немножко и решил включить кеш

И что вы думаете - 805 SQL запросов !!!

Ну что стал смотреть на эти запросы.
Бросились в глаза обращения к табличкам с префиксом ps_xip (ps_xipcategory, ps_xipcategory_shop, ps_xipposts и т.д. )
Смотрю что бы это могло быть - а это блог (Xpert Prestashop Blog), который идёт в комплекте с темой.
В блоге 6 постов, на первой странице магазина выводятся 2 первых.

Отключаю модуль блога и ... запросов становится 474 queries

Первая страничка магазина стала загружатся малость шустрее :)

Но всё равно тормозит.

Смотрим дальше - Doubles
Показывает 52 запроса вида -

SELECT pa.`id_product`, a.`color`, pac.`id_product_attribute`, XX qty, a.`id_attribute`, al.`name`, IF(color = "", a.id_attribute, color) group_by
FROM `ps_product_attribute` pa
INNER JOIN ps_product_attribute_shop product_attribute_shop
ON (product_attribute_shop.id_product_attribute = pa.id_product_attribute AND product_attribute_shop.id_shop = XX)
JOIN `ps_product_attribute_combination` pac ON (pac.`id_product_attribute` = product_attribute_shop.`id_product_attribute`)
JOIN `ps_attribute` a ON (a.`id_attribute` = pac.`id_attribute`)
JOIN `ps_attribute_lang` al ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = XX)
JOIN `ps_attribute_group` ag ON (a.id_attribute_group = ag.`id_attribute_group`)
WHERE pa.`id_product` IN (XX) AND ag.`is_color_group` = XX
GROUP BY pa.`id_product`, a.`id_attribute`, `group_by` ORDER BY a.`position` ASC;

некоторые запросы обсолютно одинаковые, то есть запрашиваются атрибуты одних и тех же продуктов.

На первой странице магазина всего 30 продуктов, и я взял ИД продукта - к примеру 59 и посчитал в скольких местах он встречается - в 11 местах.
11 * 30 = 330
то есть просто включили цикл, и перебирают в цикле все продукты, и так десяток раз.

То же самое с категориями - куча запросов вида

SELECT *
FROM `ps_category` a
LEFT JOIN `ps_category_lang` `b` ON a.`id_category` = b.`id_category` AND b.`id_lang` = 4
LEFT JOIN `ps_category_shop` `c` ON a.`id_category` = c.`id_category` AND c.`id_shop` = 1
WHERE (a.`id_category` = 68) AND (b.`id_shop` = 1) LIMIT 1

то есть выбираются параметры категорий по одной ... в цикле !

Плюс есть такой запрос -
SELECT * FROM `ps_state` ORDER BY `name` ASC
, в таблице ps_state находятся штаты для США, типа Аляски и т.д.
Доставки в США у нас нет вообще но этот запрос вызывается на каждой странице - даже на всех текстовых страницах ( там то это зачем ??? ) ...


В общем народ, как вы работаете то с Prestashop?
Может быть я что то не то делаю, что то упустил не так настроил?
 
Немного сумбурно - просто нахожусь под впечатлением от своего первого магазина на Prest'e :)

Короче поставил я свой первый магазин на Prestashop (1.7.1.2). Тему купил на themeforest.
Всё работает, всё хорошо, тема красивая - но ... всё это работает как то медленно, не то что бы слишком, но ощутимо тормозит.
Сервер у меня хороший, VPS. Аналогичные магазины, с похожим дизайном, на самописной CMS, работают гораздо быстрее.

И решил я оптимизировать работу магазина.
Везде включил кеш (КОМБИНИРОВАНИЕ, КОМПРЕССИЯ И КЕШИРОВАНИЕ, SMARTY Кеш), для теста отключил ДОПОЛНИТЕЛЬНЫЕ ВОЗМОЖНОСТИ (Комбинации, Характеристики, Группы клиентов). Включил GZIP.
всё равно тормозит. Особенно первая страничка.

И решил я посмотреть поглубже, что именно тормозит то.

Погуглил и нашел директиву _PS_DEBUG_PROFILING_ которая включает режим отладки.
Для теста отключил кеш.
Включил директиву и .... и просто ох....нел.

Первая страничка сайта, та что больше всего тормозит, угадайте сколько там SQL запросов - тадааааам 702 SQL запроса.
Это вообще как так то а ... ну минуту другую побегал я по комнате, поудивлялся немножко и решил включить кеш

И что вы думаете - 805 SQL запросов !!!

Ну что стал смотреть на эти запросы.
Бросились в глаза обращения к табличкам с префиксом ps_xip (ps_xipcategory, ps_xipcategory_shop, ps_xipposts и т.д. )
Смотрю что бы это могло быть - а это блог (Xpert Prestashop Blog), который идёт в комплекте с темой.
В блоге 6 постов, на первой странице магазина выводятся 2 первых.

Отключаю модуль блога и ... запросов становится 474 queries

Первая страничка магазина стала загружатся малость шустрее :)

Но всё равно тормозит.

Смотрим дальше - Doubles
Показывает 52 запроса вида -

SELECT pa.`id_product`, a.`color`, pac.`id_product_attribute`, XX qty, a.`id_attribute`, al.`name`, IF(color = "", a.id_attribute, color) group_by
FROM `ps_product_attribute` pa
INNER JOIN ps_product_attribute_shop product_attribute_shop
ON (product_attribute_shop.id_product_attribute = pa.id_product_attribute AND product_attribute_shop.id_shop = XX)
JOIN `ps_product_attribute_combination` pac ON (pac.`id_product_attribute` = product_attribute_shop.`id_product_attribute`)
JOIN `ps_attribute` a ON (a.`id_attribute` = pac.`id_attribute`)
JOIN `ps_attribute_lang` al ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = XX)
JOIN `ps_attribute_group` ag ON (a.id_attribute_group = ag.`id_attribute_group`)
WHERE pa.`id_product` IN (XX) AND ag.`is_color_group` = XX
GROUP BY pa.`id_product`, a.`id_attribute`, `group_by` ORDER BY a.`position` ASC;

некоторые запросы обсолютно одинаковые, то есть запрашиваются атрибуты одних и тех же продуктов.

На первой странице магазина всего 30 продуктов, и я взял ИД продукта - к примеру 59 и посчитал в скольких местах он встречается - в 11 местах.
11 * 30 = 330
то есть просто включили цикл, и перебирают в цикле все продукты, и так десяток раз.

То же самое с категориями - куча запросов вида

SELECT *
FROM `ps_category` a
LEFT JOIN `ps_category_lang` `b` ON a.`id_category` = b.`id_category` AND b.`id_lang` = 4
LEFT JOIN `ps_category_shop` `c` ON a.`id_category` = c.`id_category` AND c.`id_shop` = 1
WHERE (a.`id_category` = 68) AND (b.`id_shop` = 1) LIMIT 1

то есть выбираются параметры категорий по одной ... в цикле !

Плюс есть такой запрос -
SELECT * FROM `ps_state` ORDER BY `name` ASC
, в таблице ps_state находятся штаты для США, типа Аляски и т.д.
Доставки в США у нас нет вообще но этот запрос вызывается на каждой странице - даже на всех текстовых страницах ( там то это зачем ??? ) ...


В общем народ, как вы работаете то с Prestashop?
Может быть я что то не то делаю, что то упустил не так настроил?

Это просто некачественная тема.
Поставь стандартную, сравни и удивись :)
Кроме того сам _PS_DEBUG_PROFILING_ пишет в бд всю эту техническую хрень за каким-то лешим. Так что во-первых: он немного некорректно отображает инфу, а во-вторых: если его отключить, то будет работать немного быстрее.

Решения тут три:
- использовать тему Warehouse
- использовать тему Panda или Transformer
- использовать стандартную тему и запилить ей дизайн. Я за последний вариант, т.к. гарантирована совместимость со всеми модулями с маркета, скорость работы выше и апдейты поставятся точно и без глюков.
 
Очень частое заблуждение - куплю тему и буду в шоколаде ) и поверьте это у вас еще цветочки. Идеальный вариант дефолтная тема + дизайн + контроль :) А, ну и да, 1.7 на мой взгляд сыровата еще.
 
  • Заблокирован
  • #5
у меня 1.6.1.14 дефолтная тема, мало дополнительных модулей, много кода удалено, хостинг от inmotion тарифный план power ииии все медленно и тупит. смотрю на сайты на magento они летают, уже думаю туда смотреть
 
у меня 1.6.1.14 дефолтная тема, мало дополнительных модулей, много кода удалено, хостинг от inmotion тарифный план power ииии все медленно и тупит. смотрю на сайты на magento они летают, уже думаю туда смотреть
Нет проблем, мадженто - отличный движок. Ставил недавно.
Весь код свален в кучу. В шаблоне html совмещен с PHP. Классов нет, написать модуль, найти модуль, заказать модуль - ну, пробуйте. Модули ставятся командной строкой. Бесплатная версия убогая. Без Компосера даже на локалке не ставится (да-да, компосер - это круто, командная строка - еще лучше, отвалите). PHP7 не поддерживает. Все файлы свалены в кучу, найти что-то и поправить под себя нереально геморно. Нет AJAX корзины - ткнул в кнопку "купить" - перешел на другую страницу, которая грузится полчаса. Работает на локалке (да, я его поставил) как с дискеты. Кеш очищается командной строкой. Преимущества в SEO - писали тут мне как-то знатоки - што ето, бред сивой кобылы. Еще есть масса преимуществ, например сообщество, которое всегда поможет.
Переходите, классная ЦМСка.
ПС. У меня преста и хостинг за $7. На LoadImpact 50 пользователей в секунду держит. Магия какая-то.
 
Очень частое заблуждение - куплю тему и буду в шоколаде ) и поверьте это у вас еще цветочки. Идеальный вариант дефолтная тема + дизайн + контроль :) А, ну и да, 1.7 на мой взгляд сыровата еще.

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

Для теста взял обычную страничку магазина, со списком продуктов. В категории 14 продуктов, на странице выводятся 10.
В дефолтной теме количество запросов 275
В шаблоне от themeforest 324

То есть конечно лучше, но ЛЮДИИИ 275 запроза на страниче со списком из 10 продуктов это не реально МНОГО!!!
Это просто пипец как много.

В своей CMS для инет. магазина я беспокоился по поводу того что у меня на страничке 20 запросов, собирался то как то оптимизировать, конфиг вынести в файл и.т.д.
А тут, тут просто фигачат запросы в цикл, это же каждый студент первокурсник знает, что так делать НЕЛЬЗЯ!!!

Вот как пример
14 запросов вида
SELECT image_shop.`cover`, i.`id_image`, il.`legend`, i.`position`
FROM `ps_image` i
INNER JOIN ps_image_shop image_shop
ON (image_shop.id_image = i.id_image AND image_shop.id_shop = XX)
LEFT JOIN `ps_image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = XX)
WHERE i.`id_product` = XX
ORDER BY `position`

выбор картинки продукта, во первых почему нельзя сделать так, что бы картинка продукта, которая используется в списке продуктов была в таблице продуктов, тогда такие запросы были бы вообще не нужны.
Но раз сделали так то все эти 14 запросов можно заменить 1 просто написать

SELECT image_shop.`cover`, i.`id_image`, il.`legend`, i.`position`
FROM `ps_image` i
INNER JOIN ps_image_shop image_shop
ON (image_shop.id_image = i.id_image AND image_shop.id_shop = XX)
LEFT JOIN `ps_image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = XX)
WHERE i.`id_product` in (x1,x2,x3 .....)
ORDER BY `position`


И всё - это же азы MySQL ???

Аналогично выбираются атрибуты с цветом, доступностью на складе, акционными ценами и т.д.
То есть по этой технологии для 14 продуктов мы получаем 170 + запросов

Их все можно заменить 5-7 запросами.

Порылся в файлах Presta, посмотрел как они это делают - люди вообще не заморачиваютя.
Просто цикл который перебирает все продукты.

Нашел кстати интересную вещь, в Presta можно самому переопределить стандартные классы и контроллеры Presta.
Попробую на досуге - отпишу как получится :)
Даже самому стало интересно :)
 
вы запросы считаете под включенным дебагом?
 
вы запросы считаете под включенным дебагом?
нет дебаг ( Производительность -> Режим отладки ) я не включал
просто ставлю для _PS_DEBUG_PROFILING_ = true

Включил сейчас дебаг и запросов в дефолтной теме стало 273 queries :)
 
нет дебаг ( Производительность -> Режим отладки ) я не включал
просто ставлю для _PS_DEBUG_PROFILING_ = true

Включил сейчас дебаг и запросов в дефолтной теме стало 273 queries :)
ну так это нормально, отключите дебаг, включите кеш и проверяйте, вот пример на одном из моих работ:
стр. категории, на странице 48 тов, фильтр
Requests - 63
Load time - 1.26 s
 
Назад
Сверху