Кеширование данных

Компонент: HTTPCache

В данной статье не рассматривается вопрос о кешировании страниц вашего сайта. Здесь говорится о кешировании вычисляемых данных.

Представьте себе, что на главной странице вашего сайта располагается таблица с некой выжимкой из каталога товаров или статистической информацией. Сама таблица невелика по объему, но для ее генерации требуются ресурсы (и вычислительные, и много запросов к БД) - один-два раза, может быть, и ничего страшного, но если посещаемость сайта высока и начинаются тормоза?

Такая ситуация встречается сплошь и рядом. Хочется иметь средство для кеширования таких данных. Сгенерировали массив информации - и положили его куда-нибудь. Пришел следующий посетитель - ему дали данные из кеша. И так до тех пор, пока данные не устареют.

Именно для этого и предназначен модуль 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(...)
 ...
19.02.2014
Все статьи