Версия: 6.x
burger close
Кэширование

Использование кэширования

Кэширование позволяет повысить производительность веб-приложения. Сохраняя данные, которые не изменяются длительное время, и извлекая их, можно экономить время, затрачиваемое на генерацию этих данных.

Использование кэширования подразумевает работу с классом RS::Cache::Manager. Наиболее распространенным объектом кэширования является результат выполнения функций. Методу request сообщается callback с параметрами, результат выполнения которого необходимо извлекать из кэша, если он актуален.

Пример 1:

function foo($arg1, $arg2)
{
return "Передано: $arg1, $arg2";
}
$cache = new \RS\Cache\Manager();
$cache->invalidate('foo'); //Сбрасываем кэш для функции foo
echo $cache->request('foo', 'value1', 'value2'); //Вызовет функцию foo и вернет: Передано: value1, value2
echo $cache->request('foo', 'value1', 'value2'); //Вернет без вызова функции foo: Передано: value1, value2

Пример 2:

class Example
{
static function bar($arg1 = null, $arg2 = null)
{
return "Передано: $arg1, $arg2";
}
}
$cache = \RS\Cache\Manager::obj(); //аналог new \RS\Cache\Manager(). Применяется для вызова в одну строку.
$cache->invalidate(array('Example', 'bar'));
$cache->invalidateByTags('example');
//Закэширует результат вызова метода bar на 1 минуту
echo $cache
->tags('bar', 'example') //Помечаем кэш тегами, чтобы потом по ним можно было сбросить кэш
->expire(60) //Устанавливаем срок актуальности кэша - 1 минута
->request(array('Example', 'bar'), 'value1', 'value2');
//Закэширует результат вызова метода bar до изменения одной из перечисленных в методе watchTables таблиц ORM-объектов
echo $cache
->expire(0) //Кэш бессрочный
->watchTables(array(
new \Catalog\Model\Orm\Product,
new \Catalog\Model\Orm\Dir
))
->request(array('Example', 'bar'));

Помимо результатов выполнения функций кэшировать можно и просто заранее подготовленные данные.

$cache = new \RS\Cache\Manager();
//Формируем ключ кэша по требованиям системы кэширования, который далее можно сбросить по тегам.
$cache_key = $cache
->tags('news')
->generateKey('last_news');
if ($cache->expire(60)->validate($cache_key)) {
//Кэш актуален
$last_news = $cache->read($cache_key);
} else {
//Кэш неактуален, данные необходимо сгенерировать и сохранить в кэше
$news_api = new \Article\Model\Api();
$last_news = $news_api->getList(1, 10);
$cache->write($cache_key, $last_news);
}
var_dump($last_news);

В данный момент подсистема кэширования использует в качестве хранилища данных - файлы. Однако в перспективе, класс будет расширен и добавятся возможности установки других типов хранилища данных.

Сброс кэша

Обычно кэш необходимо сбрасывать, когда в системе произошли события, которые явно делают неактуальной информацию в кэше. Кэш некоторых данных может быть автоматически сброшен, если во время сохранения данных в кэш были установлены какие-нибудь из перечисленных условий:

  • был установлен лимит по времени с помощью метода expire
  • была осуществлена привязка к таблице ORM-объекта watchTables

В случае привязки к таблице, любые SQL запросы, начинающиеся на INSERT, UPDATE, DELETE будут сбрсывать кэш, который был зависим от этой таблицы.

Помимо автоматических вариантов сброса кэша, существует возможность "ручного" сброса кэша:

  • по имени класса, методу
  • по тегам
$cache = new \RS\Cache\Manager();
//Сбрасывает кэш любого из методов класса Example
$cache->invalidate(array('Example', '*'));
//или
$cache->invalidate(array(new Example, '*'));
//Сбрасывает кэш конкретного метода bar класса Example
$cache->invalidate(array('Example', 'bar'));
//Сбрасывает кэш по тегам
$cache->invalidateByTags('example', 'test');
//Сбрасывает весь кэш, который был создан через \RS\Cache\Manager
$cache->invalidateAll();

В ReadyScript во время некоторых системных событий происходит сброс кэша по зарезервированным тегам. Зарезервированные теги объявлены в константах:

  • CACHE_TAG_MODULE - связан с добавлением, удалением модуля
  • CACHE_TAG_SITE - связан с добавлением, удалением сайта
  • CACHE_TAG_BLOCK_PARAM - связан с изменениями в параметров любого блока в Конструкторе сайта
  • CACHE_TAG_SITE_UPDATE - после обновления системы через центр обновления, кэш по данному тегу удаляется

Чтобы поместить в кэш данные до обновления системы, необходимо выполнить следующий код:

$cache = new \RS\Cache\Manager();
$result = $cache
->expire(0)
->tags(CACHE_TAG_SITE_UPDATE)
->request('foo', 'param1', 'param2');