Кеширование данных
В данной статье не рассматривается вопрос о кешировании страниц вашего сайта. Здесь говорится о кешировании вычисляемых данных.
Представьте себе, что на главной странице вашего сайта располагается таблица с некой выжимкой из каталога товаров или статистической информацией. Сама таблица невелика по объему, но для ее генерации требуются ресурсы (и вычислительные, и много запросов к БД) - один-два раза, может быть, и ничего страшного, но если посещаемость сайта высока и начинаются тормоза?
Такая ситуация встречается сплошь и рядом. Хочется иметь средство для кеширования таких данных. Сгенерировали массив информации - и положили его куда-нибудь. Пришел следующий посетитель - ему дали данные из кеша. И так до тех пор, пока данные не устареют.
Именно для этого и предназначен модуль HTTPCache.
Настройка кеша
Кеширование можно настроить в конфигурационном файле:
$this //... ->begin_cache ->dsn('fs://../cache') ->timeout(1000) ->end //... ->end;
В секции begin_cache содержатся настройки кеширования:
- dsn - data source name; определяет вид кеша и параметры соединения с ним
- timeout - "время жизни" кеша в секундах по умолчанию; данные будут храниться не дольше этого времени
Параметр dsn указывается в зависимости от вида используемого кеша.
Виды кеша
- FS - файловый кеш; наиболее часто используемый вариант, включен по умолчанию. Параметр dsn выглядит как "fs://path", где path - путь к кешу. Стандартно он ссылается на каталог ../cache, который находится за пределами DOCUMENT_ROOT.
- APC - кеш на основе php-модуля apc. Модуль используется для кеширование байткода php-сценариев, соответственно с его помощью можно кешировать и обычные данные. Параметр dsn - "apc://".
- Memcache - Система кэширования данных, генерация которых требует большого количества ресурсов. Доступна для php в виде модуля memcache. Вся закешированная информация хранится в опреативной памяти сервера. Параметр dsn - "memcache://host:port", где host и port - параметры сервера, в оперативной памяти которого будут храниться данные.
- Dummy - тестовый кеш, который ничего не кеширует. Используется для отладки: кеширования не происходит но и логика работы приложения не изменяется. dsn: "dummy://".
Использование кеша
Объект, отвечающий за кеширование можно получить так:
$cache = WS::env()->cache;
Основные методы работы с кешем одинаковы для всех видов кеширования:
- set(string $key, mixed $value, int $timeout = null) - запись значения $value в кеш по ключу $key с заданным временем хранения (таймаутом), если передать 0, то значение будет храниться до принудительной очистки вручную. Здесь $timeout (если передано не null) перезаписывает значение по умолчанию (указанное, например, в config/site.php) конкретно для этих сохраняемых данных.
- get(string $key, mixed $default = null) - считывание значения из кеша по ключу $key. Если значение не установлено, то возвращается переменная $default.
- has(string $key) - проверка есть ли в кеше значение с ключом $key.
- delete(string $key) - удаление из кеша значения, находящегося по ключу $key.
- flush() - очистка всего кеша.
В случае файлового кеша метод get() вызывает has() и в зависимости от него возвращает установленное значение или $default, поэтому для проверки и получения переменной можно сразу использовать get().
Пример использования
Предлагается такая схема использования модуля кеширования. Необходимо где-то (в контроллере, модуле бизнес-логики, отдельном модуле) создать метод, возвращающий требуемые данные. В обычном варианте (без кеширования) этот метод просто генерирует данные и возвращает их:
static function mydata() { // Генерация данных $data = .... return $data; }
При использовании кеширования это будет выглядеть так:
static function mydata() { $cache = WS::env()->cache; // Получение данных $data = $cache->get('mydata'); // Проверка наличия данных в кеше if (!$data) { // Генерация данных, если они отсутствуют в кеше $data = .... // Кеширование сгенерированных данных $cache->set('mydata',$data); } return $data; }
В админке, если данные изменились, просто сбрасываем кеш. В контроллере табличного администрирования это удобно делать в методе on_after_change.
Вложенность данных
Данные в кеше могут быть организованы по разделам, по аналогии с подмассивами. Например, то, что относится к новостям можно держать в разделе "news":
$cache = WS::env()->cache; ... $cache->set('news:data1', $data); ... $data = $cache->get('news:data1'); ...
- в примере после вызова set() в разделе news будет сохранено значение по ключу data1. При этом, если раздела не существовало, он будет создан.
$cache = WS::env()->cache; ... $cache->set('news:data1', $data1); $cache->set('news:data2', $data2); ... $cache->delete('news'); ...
- удалять кеш можно также целыми разделами.
Дополнительный кеш
Можно дополнительно задать кеш вручную и использовать его, независимо от настроек в файле congif/site.php.
Для этого следует вызвать метод Cache::connect($dsn, $timeout).
Его параметры dsn и timeout аналогичны параметрам в config/site.php. Если не указывать timeout, то будет использовано значение по умолчанию.
Возвращаемое значение: экземпляр класса соответствующего вида кеша; аналогичен объекту WS::env()->cache.
Core::load('Cache'); $cache = Cache::connect('fs://../cache', 500); $cache->set(...) ...