Автор Тема: Как проверить что кеширование работает правильно?  (Прочитано 1653 раз)

05 Август 2015, 11:27:16
  • Ветеран
  • *****
  • Сообщений: 527
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Как проверить что кеширование работает правильно?
Например выбираю раздел перчатки ожидаю пока страница загрузится (процесс длительный).
Тут же выбираю этот раздел опять, но быстродействие не увеличилось.

В разделе РАСШИРЕННЫЕ ПАРАМЕТРЫ  -  ПРОИЗВОДИТЕЛЬНОСТЬ - КЭШИРОВАНИЕ
Установлено Да и Xcache

Заранее спасибо...
05 Август 2015, 11:39:45
Ответ #1
  • Ветеран
  • *****
  • Сообщений: 22125
  • Репутация: +25303/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
Для проверки со стороны сервера нужно лог смотреть.
Для постраничной загрузки в консоле вебмастера смотреть загрузку элементов страницы.
Сделать тесты включить кеширование, сделать замеры, выключить, опять проверка, потом сравнить.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
05 Август 2015, 11:48:03
Ответ #2
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
На виртуальном хостинг только через браузер. Page speed от Google для анализа скорости загрузки сайта. Плюс какие файлы грузятся из кеша или нет.
05 Август 2015, 12:41:55
Ответ #3
  • Ветеран
  • *****
  • Сообщений: 527
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Есть ли действенные методы которые позволят сократить количество запросов к базе?
Каким образом можно оптимизировать Блок многоуровневой навигации?
05 Август 2015, 13:17:31
Ответ #4
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
Блок многоуровневой навигации можно только заменить. Если его оптимизировать, то переделать придеться процентов 90.
Для оптимизации работы бд нужно:
Уменьшить количество запросов можно отключением модулей, все что можно перенсти в шаблоны темы.
Установить кеширование sql запросов.
Добавить кеширование на стороне клиента.
Настроить серверное кеширование.
Для работы JavaScript для сохранение изменений использовать localstorage и sessionStorage.

Все то-же самое, что делают для любого сайта. Prestashop работает по таким же принципам, что и другие сайты.
05 Август 2015, 13:18:35
Ответ #5
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
Тему оптимизации Prestashop нужно вынести в отдельный раздел. Много чего можно сделать.
06 Август 2015, 16:42:50
Ответ #6
  • Ветеран
  • *****
  • Сообщений: 527
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Версия Prestashop 1.6.0.9. Значит в defines.inc.php включил отладку SQL запросов
define('_PS_DEBUG_PROFILING_', true);

Определил запрос, время выполнения которого было максимальным при выборе категорий.

Оказалось что виноват модуль 'Блок многоуровневой навигации'

Дальнейшее вскрытие показало что проблема заключается в этом запросе

$this->products = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT
p.*,
'.($alias_where == 'p' ? '' : 'product_shop.*,' ).'
'.$alias_where.'.id_category_default,
pl.*,
image_shop.`id_image` id_image,
il.legend,
m.name manufacturer_name,
'.(Combination::isFeatureActive() ? 'product_attribute_shop.id_product_attribute id_product_attribute,' : '').'
DATEDIFF('.$alias_where.'.`date_add`, DATE_SUB("'.date('Y-m-d').' 00:00:00", INTERVAL '.(int)$nb_day_new_product.' DAY)) > 0 AS new,
stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity'.(Combination::isFeatureActive() ? ', product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity' : '').'
FROM '._DB_PREFIX_.'cat_filter_restriction cp
LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product`
'.Shop::addSqlAssociation('product', 'p').
(Combination::isFeatureActive() ?
' LEFT JOIN `'._DB_PREFIX_.'product_attribute_shop` product_attribute_shop
ON (p.`id_product` = product_attribute_shop.`id_product` AND product_attribute_shop.`default_on` = 1 AND product_attribute_shop.id_shop='.(int)$context->shop->id.')':'').'
LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (pl.id_product = p.id_product'.Shop::addSqlRestrictionOnLang('pl').' AND pl.id_lang = '.(int)$cookie->id_lang.')
LEFT JOIN `'._DB_PREFIX_.'image_shop` image_shop
ON (image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop='.(int)$context->shop->id.')
LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (image_shop.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$cookie->id_lang.')
LEFT JOIN '._DB_PREFIX_.'manufacturer m ON (m.id_manufacturer = p.id_manufacturer)
'.Product::sqlStock('p', 0).'
WHERE '.$alias_where.'.`active` = 1 AND '.$alias_where.'.`visibility` IN ("both", "catalog")
ORDER BY '.Tools::getProductsOrder('by', Tools::getValue('orderby'), true).' '.Tools::getProductsOrder('way', Tools::getValue('orderway')).' , cp.id_product'.
' LIMIT '.(((int)$this->page - 1) * $n.','.$n));

Оптимизировал данный запрос к следующему виду:

$this->products = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT
p.*,
'.($alias_where == 'p' ? '' : 'product_shop.*,' ).'
'.$alias_where.'.id_category_default,
pl.*,
MAX(image_shop.`id_image`) id_image,
il.legend,
stock.out_of_stock
FROM '._DB_PREFIX_.'cat_filter_restriction cp
LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product`
'.Shop::addSqlAssociation('product', 'p').'
LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (pl.id_product = p.id_product'.Shop::addSqlRestrictionOnLang('pl').' AND pl.id_lang = '.(int)$cookie->id_lang.')
LEFT JOIN `'._DB_PREFIX_.'image` i  ON (i.`id_product` = p.`id_product`)'.
Shop::addSqlAssociation('image', 'i', false, 'image_shop.cover=1').'
LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (image_shop.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$cookie->id_lang.')
'.Product::sqlStock('p', 0).'
WHERE '.$alias_where.'.`active` = 1 AND '.$alias_where.'.`visibility` IN ("both", "catalog")
GROUP BY product_shop.id_product
ORDER BY '.Tools::getProductsOrder('by', Tools::getValue('orderby'), true).' '.Tools::getProductsOrder('way', Tools::getValue('orderway')).' , cp.id_product'.
' LIMIT '.(((int)$this->page - 1) * $n.','.$n));

В результате в проблемных местах скорость выполнения запроса увеличилась в 100 раз. Функционал при этом остался прежним.

Так вот, за что отвечает следующий убранный мною код из запроса?
(Combination::isFeatureActive() ?
' LEFT JOIN `'._DB_PREFIX_.'product_attribute_shop` product_attribute_shop
ON (p.`id_product` = product_attribute_shop.`id_product` AND product_attribute_shop.`default_on` = 1 AND product_attribute_shop.id_shop='.(int)$context->shop->id.')':'').'
LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (pl.id_product = p.id_product'.Shop::addSqlRestrictionOnLang('pl').' AND pl.id_lang = '.(int)$cookie->id_lang.')

И зачем эти аттрибуты нужны при выводе товаров в каталоге?
06 Август 2015, 16:48:31
Ответ #7
  • Ветеран
  • *****
  • Сообщений: 1614
  • Репутация: +32/-1
  • Сообщество PrestaShop
    • Просмотр профиля
Отвечает за комбинации товара и переводы.
06 Август 2015, 16:51:10
Ответ #8
  • Ветеран
  • *****
  • Сообщений: 1614
  • Репутация: +32/-1
  • Сообщество PrestaShop
    • Просмотр профиля
На мультимагазине не будет работать.
06 Август 2015, 16:57:27
Ответ #9
  • Ветеран
  • *****
  • Сообщений: 527
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
На мультимагазине не будет работать.

Что ещё можно оптимизировать в этом запросе? Не мультимагазин....

Заранее спасибо!

07 Август 2015, 11:33:09
Ответ #10
  • Ветеран
  • *****
  • Сообщений: 3419
  • Репутация: +79/-6
  • Сообщество PrestaShop
    • Просмотр профиля
Поменял этот запрос, но время не улучшилось. Наоборот, загрузка увеличилась на 1,5 сек. Страница грузилась за 0,5сек, теперь за 2 сек.
В чем может быть проблема?
07 Август 2015, 12:39:43
Ответ #11
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
Nikola, все завист от вашего сайта. Оригинальный запрос сделан на все случаии жизни, а kdvbpspr его оптимизировал под свой сайт (только под свои условия). На вашем сайте этот запрос может не работать. Нужно включить профилирование и отследить что мешает или почему зависает ваш сайт. Без тестов это разговор ни о чем.
07 Август 2015, 12:59:05
Ответ #12
  • Ветеран
  • *****
  • Сообщений: 3419
  • Репутация: +79/-6
  • Сообщество PrestaShop
    • Просмотр профиля
Это понятно, что под себя оптимизировать нужно. ладно бы не работал сайт после изменений, тут все ясно. А вот почему время увелилось не понятно.
07 Август 2015, 13:27:35
Ответ #13
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
Включите профиллирование. Так сможете увидить что мешает работе сайта.
07 Август 2015, 15:33:31
Ответ #14
  • Ветеран
  • *****
  • Сообщений: 1614
  • Репутация: +32/-1
  • Сообщество PrestaShop
    • Просмотр профиля
Интересно, можно все запросы переписать под себя. Это реально увелит скорость. Может кто-то пробывал, поделитесь.