Компонент Cache
Дата обновления перевода 2025-02-03
Компонент Cache
Компонент Cache предоставляет функции, охватывающие задачи кэша от простых, до продвинутых. Он нативно реализует PSR-6 и Контракты кэширования для отличного взаимодействия. Он создан для производительности и устойчивости, поставляется с готовыми к использованию адаптеами для наиболее распространенных бэкендов кэширования. Он подключает инвалидацию, основанную на тегах, и защиту от наплыва кэша, путем блокировок и раннего срока истечения.
Tip
Компонент также содержит адаптеры для преобразования между кэшами PSR-6
и PSR-16. см.e Адаптеры для взаимодействия между кешами PSR-6 и PSR-16.
Установка
1
$ composer require symfony/cache
Note
Если вы устанавливаете этот компонент вне приложения Symfony, вам нужно
подключить файл vendor/autoload.php
в вашем коде для включения механизма
автозагрузки классов, предоставляемых Composer. Детальнее читайте в
этой статье.
Контракты кэша против PSR-6
Данный компонент включает в себя два разных подхода к кэшированию:
- Кэширование PSR-6 :
- Базовая система кэширования, которая включает в себя "пулы" и "объекты" кэша.
- Контракты кэширования :
- Более простой, но при этом более мощный способ хранить значения кэша, основываясь на обратных вызовах повторных вычислений.
Tip
Рекомендуется использование Контрактов кэширования: они требуют меньше рутинного кода и предоставляют защиту от наплыва кэша по умолчанию.
Контракты кэширования
Все адаптеры поддерживают Контракты кэширования. Они содержат только два метода:
get()
и delete()
. Метода set()
нет, так как метод get()
как
получает, так и устанавливает значения кэша.
Первое, что вам нужно сделать, - инстанциировать адаптер кэша. В этом примере используется FilesystemAdapter:
1 2 3
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
$cache = new FilesystemAdapter();
Теперь вы можете извлекать и удалять кэшированные данные, используя этот объект.
Первый аргумент метода get()
- это ключ, произвольная строка, которую вы
ассоциируете с кэшированным значением, чтобы вы могли извлечь его позже. Второй
аргумент - PHP-вызываемое, которое выполняется, когда ключ не найден в коде, чтобы
сгенерировать и вернуть значение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
use Symfony\Contracts\Cache\ItemInterface;
// Вызываемое будет выполнено только в случае неудачи кэша.
$value = $cache->get('my_cache_key', function (ItemInterface $item): string {
$item->expiresAfter(3600);
// ... выполнить какой-то HTTP-запрос или сложные вычисления
$computedValue = 'foobar';
return $computedValue;
});
echo $value; // 'foobar'
// ... и удалить ключ кэша
$cache->delete('my_cache_key');
Note
Используйте теги кэша, чтобы удалять более одного ключа за раз. Прочтите больше в Инвалидация кеша.
Предотвращение наплыва
Контракты кэша также имеют встроенное предотвращение наплыва. Оно удалит всплески CPU в моменты, когда кэш будет холодным. Если образец приложения использует 5 секунд, чтобы вычислить данные, которые были кэшированы в течение часа, и к этим данным запрашивается доступ 10 раз в секунду, это означает, что у вас в основном будут попадания в кэш, и все хорошо. Но через час, мы получим 10 новых запросов к холодному кэшу. Поэтому данные будут вычисляться снова. А еще через секунду произойдет то же самое. Поэтому данные будут вычисляться примерно 50 раз до того, как кэш снова разогреется. Вот тут-то вам и понадобится предотвращение наплыва.
Первое решение - использовать блокировку: разрешать только один PHP-процесс (на основании хостинга) вычислять конкретный ключ в текущий момент времени. Блокировка встроена по умолчанию, поэтому вам не нужно делать ничего, кроме как пользоваться преимуществами контрактов кэширования.
Второе решение также встроено при использовании контрактов кэширования: вместо того, чтобы ждать полное время ожидания до истечения срока значения, повторно вычислите его до истечения срока. Алгоритм Вероятностного раннего истечения срока рандомно имитирует неудачу кэша для одного пользователя, в то время как другие получают кэшированное значение. Вы можете контролировать его поведение с помощью третьего необязательного параметра get(), который является плавающим значением под названием "beta".
По умолчанию, бета равна 1.0
, а более высокие значения означают более раннее
повторное вычисление. Установите ее как 0
, чтобы отключить раннее повторное
вычисление, и как INF
, чтобы форсировать немедленное повторное вычисление:
1 2 3 4 5 6 7 8 9
use Symfony\Contracts\Cache\ItemInterface;
$beta = 1.0;
$value = $cache->get('my_cache_key', function (ItemInterface $item): string {
$item->expiresAfter(3600);
$item->tag(['tag_0', 'tag_1']);
return '...';
}, $beta);
Доступные адаптеры кэша
Доступны следующие адаптеры кэша:
- Адаптер кэша APCu
- Адаптер массива кэша
- Адаптер цепочки кеша
- Адаптер кэша Couchbase Bucket
- Адаптер коллекции кэша Couchbase
- Адаптер кеша Doctrine
- Адаптер кеша Doctrine DBAL
- Адаптер кэша Filesystem
- Адаптер кэша Memcached
- Адаптер кеша PDO
- Адаптер кеша PDO & Doctrine DBAL
- Адаптер кеша PHP массива
- Адаптер кэша PHP-файлов
- Адаптер кеша прокси
- Адаптер кеша Redis
Общее кэширование (PSR-6)
Чтобы использовать общие возможности кэширования PSR-6, вам понадобится выучить его ключевые концепты:
- Объект
- Одна единица информации, хранящаяся в виде пары ключ-значение, где ключ - уникальный идентификатор информации, а значение - его содержимое; см. статью Объекты кеша, чтобы узнать больше.
- Пул
- Логическое хранилище объектов кэша.Все операции кэша (сохранение объектов, поиск объектов и др.) выполняются через пул. Приложения могут определять столько пулов, сколько необходимо.
- Адаптер
- Реализует сам механизм кэширования, чтобы хранить информацию в файловой системе, DB и др. Компонент предоставляет несколько готовых к использованию адаптеров для распространённых бэк-эндов кэширования (Redis, APCu, Doctrine, PDO, и т.д.)
Базовое применение (PSR-6)
Эта часть компонента является реализацией PSR-6, что означает, что его базовый API совпадает с определённым в стандарте. До того, как кэшировать информацию, создайте пул кэша, используя любые встроенные адаптеры. Например, чтобы создать кэш, основанный на файловой системе, инстанциируйте FilesystemAdapter:
1 2 3
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
$cache = new FilesystemAdapter();
Теперь вы можете создавать, извлекать, обновлять и удалять объекты, используя этот пул кэша:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
// создайте новый объект, пытаясь получить его из кэша
$productsCount = $cache->getItem('stats.products_count');
// назначьте значение объекту и сохраните его
$numProducts->set(4711);
$cache->save($numProducts);
// извлеките объект кэша
$productsCount = $cache->getItem('stats.products_count');
if (!$productsCount->isHit()) {
// ... объект не существует в кэше
}
// извлеките значение, хранимое объектом
$total = $productsCount->get();
// удалите объект кэша
$cache->deleteItem('stats.products_count');
Чтобы увидеть список всех поддерживаемых адаптеров, см. Пулы кеша и поддерживаемые адаптеры.
Маршаллинг (сериализация) данных
Note
Маршаллинг и сериализация являются схожими концептами. Сериализация - это процесс перевода состояния объекта в формат, который может быть сохранен (например, в файл). Маршалинг - это процесс перевода как состояния объекта, так и его базы исходного кода, в формат, который может быть сохранен или передан.
Демаршалинг объекта производит копию изначального объекта, возможно путем автоматической загрузки определений класса объекта.
Symfony использует маршалеров (классы, реализующие MarshallerInterface), чтобы обрабатывать объекты кэширования перед их сохранением.
DefaultMarshaller использует
serialize()
или igbinary_serialize()
PHP, если установлено расширение Igbinary:
use SymfonyComponentCacheAdapterRedisAdapter; use SymfonyComponentCacheDefaultMarshaller; use SymfonyComponentCacheDeflateMarshaller;
$marshaller = new DeflateMarshaller(new DefaultMarshaller()); // вы можете оционально использовать расширение Igbinary, если оно у вас установлено // $marshaller = new DeflateMarshaller(new DefaultMarshaller(useIgbinarySerialize: true));
$cache = new RedisAdapter(new Redis(), 'namespace', 0, $marshaller);
Существуют и другие маршаллеры, которые могут зашифровывать или сжимать данные перед их сохранением.
7.2
В версиях Symfony, предшествующих 7.2, функция igbinary_serialize()
использовалась по умолчанию, когда было установлено расширение Igbinary.
Начиная с Symfony 7.2, вы должны включить поддержку Igbinary явно.
Продвинутое использование
- Адаптер кэша APCu
- Адаптер массива кэша
- Адаптер цепочки кеша
- Адаптер кэша Couchbase Bucket
- Адаптер коллекции кэша Couchbase
- Адаптер кеша Doctrine
- Адаптер кеша Doctrine DBAL
- Адаптер кэша Filesystem
- Адаптер кэша Memcached
- Адаптер кеша PDO
- Адаптер кеша PDO & Doctrine DBAL
- Адаптер кеша PHP массива
- Адаптер кэша PHP-файлов
- Адаптер кеша прокси
- Адаптер кеша Redis
- Инвалидация кеша
- Объекты кеша
- Пулы кеша и поддерживаемые адаптеры
- Адаптер кеша PDO & Doctrine DBAL
- Адаптер кеша Php массива
- Адаптер кеша прокси
- Адаптеры для взаимодействия между кешами PSR-6 и PSR-16