Автор Тема: Закешировать getFilterBlock  (Прочитано 461 раз)

01 Июнь 2021, 15:59:37
  • Ветеран
  • *****
  • Сообщений: 527
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Добрый день,

В модуле blocklayered есть метод getFilterBlock. Здесь сосредоточена вся логика формирования фильтров.
Запрос для получение данных получается достаточно тяжёлый.

Поэтому я хочу использовать Cache.

Проблема в формировании ключа кеша,
т.к. в самом запросе много параметров.

Случайно не сталкивались с подобным?
02 Июнь 2021, 09:25:57
Ответ #1
  • Ветеран
  • *****
  • Сообщений: 527
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Как то так или есть другие варианты?

public function getFilterBlock($selected_filters = array())
    {
        ......

        $cacheKey = 'getFilterBlock'.md5(serialize($selected_filters));
02 Июнь 2021, 10:54:56
Ответ #2
  • Ветеран
  • *****
  • Сообщений: 1810
  • Репутация: +49/-1
  • Сообщество PrestaShop
    • Просмотр профиля
У вас версия prestashop какая?
В модуле многоуровневой навигации для prestashop 1.7 есть кеширование запросов.
02 Июнь 2021, 13:31:28
Ответ #3
  • Ветеран
  • *****
  • Сообщений: 1285
  • Репутация: +13/-1
  • Сообщество PrestaShop
    • Просмотр профиля
У вас версия prestashop какая?
В модуле многоуровневой навигации для prestashop 1.7 есть кеширование запросов.
И в blocklayered для prestashop 1.6 кешируются запросы
public function getFilterBlock($selected_filters = array())
{
    ...
    if (is_array($cache))
return $cache;
Зачем повторять кеширование?
Если вам sql запросы нужно кешировать, то это настраивается на стороне сервера.
А в prestashop все запросы кешируются по умолчанию
Метод execute($sql, $use_cache = 1) класса DB
02 Июнь 2021, 18:29:56
Ответ #4
  • Ветеран
  • *****
  • Сообщений: 527
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Что касается $cache, то
static $cache = null;
, это старый добрый трюк с кэшированием в статической переменной.

У меня реализована возможность использовать кеширование Memcached не для всего сайта, а для конкретного случая.
Сделал как описано здесь:
https://prestafaq.ru/103/%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D0%B5%D1%82-%D0%BE%D1%82%D0%BA%D0%BB%D1%8E%D1%87%D0%B8%D1%82%D1%8C-%D0%BA%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B2-prestashop

Мне нужно кешировать в модуле blocklayered результат метода getFilterBlock.
Где сосредоточена вся логика формирования фильтров, в том числе через CREATE TEMPORARY TABLE,
аргумент $use_cache установлен в false.

Просто посмотрел лог mysql по медленным запросам с сервера,
и увидел, что самый медленный запрос формируется именно в методе getFilterBlock.

Других вариантов как ускорить этот процесс я не вижу.
Что скажете?
В наличии P.S. 1.6