Подключаем компонент:
composer require symfony/cache
Как сделать простой кеш в файлах?
require_once __DIR__ . '/vendor/autoload.php';
// создаём объект для управления кешом в файлах
$cache = new FilesystemAdapter(
// поддиректория в папке кеша
'mySubDirectoryName',
// время жизни кеша по умолчанию
86400,
// путь к папке кеша
__DIR__ . '/cache'
);
// ключ кеша
$cacheKey = 'testKey1';
// получаем по этому ключу данные из кеша
$value = $cache->get(
$cacheKey,
// если актуального кеша нет, то выполнится этот callable:
function () {
// тут мы получаем данные без кеша,
// и отдаём их в return,
// после этого данные сохранятся в кеш
$value = rand();
return $value;
}
);
Как задать время жизни кеша?
$value = $cache->get(
$cacheKey,
// в первом аргументе приходит объект CacheItem
function (CacheItem $item) {
// выставляем время жизни 1 час
$item->expiresAfter(3600);
// или бесконечное время жизни
// $item->expiresAfter(0);
// или указываем точное время
// $item->expiresAt(new \DateTime('tomorrow 10:00'));
$value = rand();
return $value;
}
);
Как удалить кеш по ключу?
$cache->delete($cacheKey);
Как удалить все значения кеша?
$cache->clear();
Как пометить кеш тегом?
// добавляем обёртку TagAwareAdapter
$cache = new TagAwareAdapter(
new FilesystemAdapter(
'mySubDirectoryName',
86400,
__DIR__ . '/cache'
)
);
$cacheKey = 'testKey1';
$value = $cache->get(
$cacheKey,
function (CacheItem $item) {
// помечаем кеш тегом
$item->tag('tag1');
$value = rand();
return $value;
}
);
Как удалить кеш по тегу?
$cache->invalidateTags(['tag1']);
Как временно отключить чтение из кеша?
$value = $cache->get(
$cacheKey,
function () {
$value = rand();
return $value;
},
// передаём в третьем аргументе бесконечность
INF
);
Если нужна возможность чтения кеша человеком, то можно воспользоваться хранением кеша в php файлах:
$cache = new PhpFilesAdapter(
'',
86400,
__DIR__ . '/cache'
);
А ещё такой кеш будет подгружаться из OPcache, если он включён.
Как очистить хранилище от неактуальных значений кеша?
$cache->prune();
Необходимо реализовать такую очистку кеша по расписанию, т. к. при хранении кеша в файлах нет автоматического удаления неактуальных файлов.
Крон-скрипт (например, раз в день):
require_once __DIR__ . '/vendor/autoload.php';
$cache = new ChainAdapter([
new FilesystemAdapter(
'',
86400,
__DIR__ . '/cache'
),
new PhpFilesAdapter(
'',
86400,
__DIR__ . '/cache'
),
]);
$cache->prune();
При этом объекты кеша должны быть ровно такими же как они используются при создании кеша. Например, должны включать обёртку TagAwareAdapter, если она используется. Поэтому желательно вынести создание объекта кеша в отдельный класс и получать объект хранилища кеша оттуда.
Также очистить кеш от неактуальных значений можно через консоль symfony:
php bin/console cache:pool:prune
Какие доступны способы хранения кеша?
APCu Cache Adapter
Хранит значения в общедоступной памяти текущего сервера. Быстрый кеш, но использовать желательно только для небольшого размера данных.
Array Cache Adapter
Хранит значения в массиве в текущем процессе php, как правило используется только для тестирования.
Chain Cache Adapter
Управляет списком хранилищ кеша. Сохраняет значение во все хранилища, а возвращает из первого, где найдёт актуальное значение.
Doctrine Cache Adapter
Это обёртка для doctrine/cache, т. е. для хранения значений в БД с использованием Doctrine.
Filesystem Cache Adapter
Хранит значения на диске. Медленный. Лучше использовать Apcu, Memcached, Redis или Doctrine, PDO.
Memcached Cache Adapter
Хранит значения в Memcached. Можно вынести кеш на отдельный сервер или кластер.
PDO & Doctrine DBAL Cache Adapter
Хранит значения в БД. Подключение передаётся через PDO или через Doctrine DBAL.
PHP Array Cache Adapter
Хранит значения на диске в одном файле, но загружается из OPcache при включенной настройке opcache.enable, поэтому будет работать быстро для статических данных.
PHP Files Cache Adapter
Тоже самое, что и Filesystem Cache Adapter, только хранит данные в виде php кода, поэтому тоже может загружаться из OPcache.
Proxy Cache Adapter
Адаптер для интеграции с любым кешом, который поддерживает интерфейс PSR-6 Psr\Cache\CacheItemPoolInterface
Redis Cache Adapter
Хранит значения в памяти на Redis сервере/серверах. Принимает первым аргументом объект соединения с Redis.
Что ещё?
Как сделать отложенное сохранение нескольких экземпляров кеша?