Как пользоваться symfony cache?

Подключаем компонент:

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.

Что ещё?

Как сделать отложенное сохранение нескольких экземпляров кеша?