Кеширование

В стандартную установку Kohana входит модуль кеширования, предоставляющий функции кеширования через следующие методы:

  • APC — Alternative PHP Cache,
  • File — Файловый кеш средствами Kohana,
  • Memcached (с поддержкой тегов),
  • SQLite (с поддержкой тегов),

Конфигурация

Пример конфигурации находится в файле modules/cache/config/cache.php. Скопируйте его в application/config и откройте. Файл представляет собой список групп конфигураций, каждая из которых содержит настройки для отдельного метода кеширования.

Для каждой из групп конфигураций обязательно указать:

  • driver — метод кеширования, доступные значения: apc, file, memcache, memcachetag, sqlite, wincache.
  • default_expire — стандартное время жизни одной записи. По умолчанию 600 (1 час).

Остальные настройки зависят от метода кеширования:

Memcache

  • compression — использовать ли сжатие данных Zlib?
  • instant_death — отключать ли кеширование, если сервер memcache недоступен с первого раза?

Также для memcache нужно передать список серверов, для каждого из которого нужно указать:

  • host — хост с memcache-сервером.
  • port — порт
  • weight
  • timeout
  • retry_interval
  • status
  • persistent — использовать ли постоянное соединение?

Более подробно об этих параметрах можно прочитать на http://www.php.net/manual/en/memcache.addserver.php.

SQLite

  • database — Файл, в котором хранится кеш.
  • schema — Схема таблицы.

Файловый кеш

  • cache_dir — директория, в которой будут сохраняться кеш-данные.
  • ignore_on_delete — список файлов, которые будут игнорированы при удалении. По умолчанию это папки, создаваемые системами контроля версий SVN и Git.

Использование

Для обращения к методам кеширования, нужно инициализировать подключение через метод Cache::instance($group), где $group — группа настроек.

Например, следующий код инициализирует подключение к memcache:

$cache = Cache::instance('memcache');

Получение данных

Получение данных реализует метод get($id, $default), где $id — имя ключа, $default — значение (по умолчанию NULL), возвращаемое если ключ не существует.

$result = $cache->get('count');
if($result === NULL)
{
	// Данные не существуют в кеше, достаем из основного места
}

Более удобная запись выглядит так:

if( !$result = Cache::instance()->get('somekey'))
{
	$result = $some_model->get_result_from_db();
}

Для драйверов, поддерживющих теги, доступен метод find($tag), который возвращает массив всех записей с тегом $tag:

$results = Cache::instance()->find('sometag');
Memcached поддерживает теги, но не поддерживает поиск по тегам. При попытке вызвать метод будет вызвана ошибка Cache_Exception.

Запись данных

Запись данных в кеш осуществляется методом set($id, $data, $lifetime), где $id — имя ключа, $data — значение ключа и $lifetime — время жизни (по умолчанию — 1 час).

Следующий код кеширует ключ somekey на 3 часа:

$status = $cache->set('somekey', 'some data', Date::HOUR * 3);

Чтобы записать ключ с тегами, используется метод set_with_tags($id, $data, $lifetime, $tags), который идентичен методу set() за исключением параметра $tags, который содержит массив тегов для вставляемой записи:

Cache::instance()->set_with_tags('somekey', 'some data', Date::HOUR * 3, array('posts', 'popular_posts'));

Удаление данных

Удаление данных происходит через метод delete($id), где $id — имя ключа.

$cache->delete('somekey');

Используйте метод delete_tag($tag), чтобы удалить все записи с тегом $tag.

$cache->delete_tag('somekey');

Чтобы удалить все записи, используется метод delete_all():

$cache->delete_all();

Практическое использование

Пример практического использования:

// Пытаемся достать запись из кеша
if( !$count = Cache::instance()->get('count'))
{
	// Запись не найдена, тогда достаем данные из БД
	$count = DB::select(array('COUNT("*")', 'records_found'))->from('product')->execute()->get('records_found', 0);
	// И записываем их в кеш на 15 минут
	Cache::instance()->set('count', $count, Date::MINUTE * 15);
}
// Результат
echo 'Всего товаров в базе: '.$count;

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *