Как кэшировать некоторые части кода

Lightning содержит простой и мощный механизм кэширования, который может быть использован разработчиками и продвинутыми пользователями для ускорения магазина. Он позволяет кэшировать результат выполнения любой части кода добавлением всего двух строк.

Конечно, сначала нужно знать, какую часть кода стоит закешировать. В этом могут помочь Метрики генерации страницы.

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

public function getCategoryFilters($category_id) {
    if (defined('Lightning') and in_cache()) return cache();

В конце функции добавим вторую строку перед возвратом результата:

    if (defined('Lightning')) cache($result);
    return $result;

Возвращаемая переменная или выражение должно быть вписано в cache(...).

В этом простейшем случае результат функции будет закеширован с помощью ключа, который состоит из названий класса и функции и всех параметров, которые были в вызове. В нашем примере это может быть ModelCatalogCategory->getCategoryFilters(15)

По умолчанию кэш будет использоваться до тех пор, пока не изменится таблица product. Хоть это самая распространенная причина очистки кэша, для нашего случая она не совсем подходит. Допустим, наша функция зависит от таблиц oc_category и oc_category_filter. Тогда первая строка будет выглядеть так:

     if (defined('Lightning') and in_cache(NULL, 'category category_filter')) return cache();

Обратите внимание, что в таблицы указываются без префикса. Первый параметр - опциональный ключ кеширования, и NULL здесь говорит, что мы хотим использовать стандартную схему (ModelCatalogCategory->getCategoryFilters(15)).

Иногда нет таблиц, на которые можно бы было положиться, и нам нужно кэшировать результат в течение некоторого периода времени. В этом случае мы можем указать время кэширования в секундах вместо таблиц. Например, 5 минут:

     if (defined('Lightning') and in_cache(NULL, 5*60)) return cache();

Мы можем определить наш собственный ключ кэширования (он является строкой, не ограниченой по длине). Это необходимо, если результат зависит от других вещей, кроме параметров функции. Давайте предположим, что наш результат зависит от $category_id и группы клиента. Тогда код будет выглядеть так:

     $key = $category_id . $this->customer->getGroupId();
     if (defined('Lightning') and in_cache($key, 5*60)) return cache();

Такой кэш очищается при очистке кеша Lightning и отображается в Метрики генерации страницы:

Также этот код не дает никаких ошибок, если Lightning не установлен или отключен, его безопасно добавлять в код магазина или дополнений.

Создано 2020-05-03