Использование кэширования
Кэширование позволяет повысить производительность веб-приложения. Сохраняя данные, которые не изменяются длительное время, и извлекая их, можно экономить время, затрачиваемое на генерацию этих данных.
Использование кэширования подразумевает работу с классом RS::Cache::Manager. Наиболее распространенным объектом кэширования является результат выполнения функций. Методу request сообщается callback с параметрами, результат выполнения которого необходимо извлекать из кэша, если он актуален.
Пример 1:
function foo($arg1, $arg2)
{
return "Передано: $arg1, $arg2";
}
$cache = new \RS\Cache\Manager();
$cache->invalidate('foo');
echo $cache->request('foo', 'value1', 'value2');
echo $cache->request('foo', 'value1', 'value2');
Пример 2:
class Example
{
static function bar($arg1 = null, $arg2 = null)
{
return "Передано: $arg1, $arg2";
}
}
$cache->invalidate(array('Example', 'bar'));
$cache->invalidateByTags('example');
echo $cache
->tags('bar', 'example')
->expire(60)
->request(array('Example', 'bar'), 'value1', 'value2');
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();
$cache->invalidate(array('Example', '*'));
$cache->invalidate(array(new Example, '*'));
$cache->invalidate(array('Example', 'bar'));
$cache->invalidateByTags('example', 'test');
$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');