Кэширование данных заключается в сохранении некоторой переменной PHP в кэше и её последующем извлечении. Оно является основой для расширенных возможностей, таких как кэширование запросов и кэширование страниц. Типичные варианты кэширования и получения данных:
1 2 3 4 5 6 7 8 9 10 11 12 | // пробуем извлечь $data из кеша $data = $cache ->get( $key ); if ( $data === false) { // $data нет в кеше, вычисляем заново $data = $this ->calculateSomething(); // сохраняем значение $data в кеше $cache ->set( $key , $data ); } // значение $data доступно здесь $data = $cache ->getOrSet( $key , function () { return $this ->calculateSomething(); }); |
Когда анонимной функции требуются данные из внешней области видимости:
1 2 3 4 | $user_id = 42; $data = $cache ->getOrSet( $key , function () use ( $user_id ) { return $this ->calculateSomething( $user_id ); }); |
Компоненты кэширования
Кэширование данных опирается на компоненты кэширования, которые представляют различные хранилища, такие как память, файлы и базы данных. Кеш-компоненты, как правило, зарегистрированы в качестве компонентов приложения, так что их можно настраивать и обращаться к ним глобально.
Кэширование с использованием файлов:
1 2 3 4 5 6 7 8 9 10 11 | $config = [ /*...*/ 'components' => [ /*...*/ 'cache' => [ 'class' => 'yii\caching\FileCache' , ], /*...*/ ], /*...*/ ]; |
Кэширование с использованием Memcached с двумя серверами:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | $config = [ /*...*/ 'components' => [ /*...*/ 'cache' => [ 'class' => 'yii\caching\MemCache' , 'servers' => [ [ 'host' => 'server1' , 'port' => 11211, 'weight' => 100, ], [ 'host' => 'server2' , 'port' => 11211, 'weight' => 50, ], ], /*...*/ ], /*...*/ ]; |
Теперь получить доступ к компоненту кэша можно используя выражение Yii::$app->cache.
Класс yii\caching\Cache
У всех компонентов кэша имеется один базовый класс yii\caching\Cache со следующими методами:
- get() — возвращает данные по ключу
- set() — сохраняет данные по ключу
- add() — сохраняет данные по ключу, если такого ключа ещё нет
- getOrSet() — возвращает данные по указанному ключу
- multiGet() — извлекает сразу несколько элементов
- multiSet() — сохраняет несколько элементов данных
- multiAdd() — сохраняет несколько элементов данных
- exists() — есть ли указанный ключ в кэше
- delete() — удаляет указанный ключ
- flush() — удаляет все данные
Нельзя кешировать значение false, потому что метод get() использует false для случая, когда данные не найдены в кеше. Но можно обернуть false в массив и закешировать его, чтобы обойти это ограничение.
Срок действия кеша
Данные, сохраненные в кеш, остаются там навсегда и могут быть удалены только из-за особенностей функционирования хранилища (например, место для кэширования заполнено и старые данные удаляются). Чтобы изменить этот режим, можно передать время жизни кеша при вызове метода set():
1 2 | // хранить данные не более 45 секунд $cache ->set( $key , $data , 45); |
Можно изменить значение по умолчанию (бесконечность) для длительности кэширования, задав defaultDuration в конфигурации компонента кеша.