Документация/Контейнер/Сервисы/Cache

Кеширование данных

Сервис кеширования фреймворка Cache представляет собой простой файловый кеш для данных. Его методы поддерживают PSR-16. Принцип работы кеширования следующий:
Данные помещаются в кеш по уникальному ключу c указанием времени ttl в секундах.
В течении этого времени, начиная от создания кеша, запросы кеша по этому ключу отдают кешированные данные, они не изменяются.
Можно очистить кеш принудительно по ключу или весь в любое время.
Если кеш не был создан, очищен или просрочен, то будет создан новый кеш на указанное время.

Во встроенной реализации сервиса поддерживаются основные типы данных PHP - строки, числовые значения, массивы, объекты (через сериализацию).

Если вам нужны более расширенные возможности для кеширования, то добавьте в контейнер другую реализацию, заменяющую текущую или дополнительную. Это может быть компонент github.com/symfony/cache.

Способы использования Cache в контроллерах (и всех классах, унаследованных от Hleb\Base\Container) на примере получения кеша по ключу:

// variant 1
use Hleb\Reference\CacheInterface;
$data $this->container->get(CacheInterface::class)->get('cache_key');

// variant 2
$data $this->container->cache()->get('cache_key');

Пример получения кеша из Cache в коде приложения:

// variant 1
use Hleb\Static\Container;
use 
Hleb\Reference\CacheInterface;
$data Container::get(CacheInterface::class)->get('cache_key');

// variant 2
use Hleb\Static\Cache;
$data Cache::get('cache_key');

Также объект Cache может быть получен через внедрение зависимостей по интерфейсу Hleb\Reference\Interface\Cache.

Для упрощения примеров, далее они будут содержать только обращение через Hleb\Static\Cache.


#Уникальный ключ

Самое сложное в таком способе кеширования (кроме инвалидации) - подобрать уникальный ключ, однозначно идентифицирующий кешируемые данные.

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


#Инициализация кеша

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

use Hleb\Static\Cache;

$key 'example_cache_key';

if (!
Cache::has($key)) {
    
$data mt_rand(); // Receiving data.
    
Cache::set($key$datattl60);
} else {
    
$data Cache::get($key);
}

Здесь были использованы методы get(), set() и has(), соответственно - получение, добавление в кеш и проверка его наличия по ключу.

Эти три метода заменяет один метод getConform(), который оперирует с Closure-функцией для получения данных, если они не найдены в кеше.

use Hleb\Static\Cache;

$data Cache::getConform('example_cache_key', function () {
    return 
mt_rand(); // Receiving data.
}, ttl60);

Пример с функцией-замыканием, использующей внешний контекст:

use Hleb\Static\Cache;

$param 10;
$data Cache::getConform('example_cache_key',
    function () use (
$param) {
        return 
mt_rand() * $param// Data calculation.
    
}, ttl60);

#Очистка кеша

Весь кеш во фреймворке очищается методом clear(), но нужно быть осторожным при большом количестве кеша, этот вызов должен использоваться достаточно редко, также это можно сделать консольной командой:

$php console --clear-cache

Очистка всего кеша повлияет только на данные кешированных шаблонов и данные фреймворка, добавленные сервисом Cache. Шаблонизатор TWIG имеет собственную реализацию кеша и для его очистки предназначена отдельная консольная команда.

Если возникла необходимость удалить кеш по одному из ключей, то это можно сделать при помощи метода delete().

Для того чтобы фреймворк отслеживал автоматически максимальный размер кеша, нужно настроить опцию 'max.cache.size' в файле /config/common.php.
Значение представляет собой целое число в мегабайтах. В силу неравномерного распределения кеша в файлах это будет приблизительное отслеживание максимального размера директории с файлами кеша.

Если кеширование не происходит, то убедитесь, что включена настройка 'app.cache.on' в файле /config/common.php, которую рекомендовано отключать в режиме отладки.

Response Логирование

Страница создана: @fomiash
К началу страницы