Простой кеш
Аналогом CPHPCache в D7 является класс \Bitrix\Main\Data\Cache. Основные различия в методах в том, что названия методов нового класса пишутся с прописной буквы в соответствии с новыми требования оформления кода. В остальном внешне изменений практически нет:
use \Bitrix\Main\Data\Cache;
$cache = Cache::createInstance(); // получаем экземпляр класса
if ($cache->initCache(7200, "cache_key")) { // проверяем кеш и задаём настройки
$vars = $cache->getVars(); // достаем переменные из кеша
}
elseif ($cache->startDataCache()) {
// некоторые действия...
$cache->endDataCache(array("key" => "value")); // записываем в кеш
}
Описание параметров метода initCache:
/**
* @access public
* @param mixed $TTL Время жизни кеша в секундах.
* @param mixed $uniqueString Уникальный идентификатор кеша.
* @param bool $initDir (default: false) Папка, в которой хранится кеш, относительно /bitrix/cache/
* @param string $baseDir (default: "cache") Базовая директория кеша. По умолчанию равен cache
* @return bool true, если кеш валидный
*/
public function initCache($TTL, $uniqueString, $initDir = false, $baseDir = "cache")
Управляемый кеш
Также в D7 появился удобный доступ к управляемому кешу, объект для управления кешем можно получить из объекта приложения:
$cache = \Bitrix\Main\Application::getInstance()->getManagedCache();
$cache является объектом \Bitrix\Main\Data\ManagedCache.
Пример использования:
if ($cache->read($cacheTtl, $cacheId)) {
$vars = $cache->get($cacheId); // достаем переменные из кеша
} else {
// некоторые действия...
$cache->set($cacheId, array("key" => $value)); // записываем в кеш
}
Для принудительной очистки кеша по ключу используем:
$cache->clean($cacheId);
Кеширование выборок из БД
В версии 16.5.9 в ORM появилось кеширование выборок из базы данных:
v16.5.9 (beta) 2016-10-20 Разработчикам: в ORM добавлено управляемое кеширование выборок (ключ "cache" в параметрах getList()).
Чтобы закешировать результат getList нужно задать ключ cache. Например, при получении элементов инфоблока:
$query = \Bitrix\Iblock\ElementTable::getList(array(
'select' => array('ID', 'NAME', 'XML_ID'),
'filter' => array('IBLOCK_ID' => 1),
'cache' => array(
'ttl' => 60,
'cache_joins' => true,
)
));
$result = $query->fetch();
Параметров ttl задаётся время жизни кеша, а cache_joins задаёт необходимость кеширования при наличии джойнов. Внутри используется управляемое кеширование. Кеш пишется в папку /bitrix/managed_cache/MYSQL/orm_%имя_таблицы_сущности_orm%/
с ключом md5(%sql-запрос%)
.
В настройках CMS (/bitrix/.settings.php) можно задать глобальный диапазон ttl для отдельных таблиц с помощью настройки cache_flags:
...
'cache_flags' => array(
'value'=> array(
"b_iblock_element_min_ttl" => 60,
"b_iblock_element_max_ttl" => 86400,
)
),
...
Для того, чтобы очистить кеш выборок сущности, нужно вызвать метод cleanCache. Например, для элементов инфоблока:
\Bitrix\Iblock\ElementTable::getEntity()->cleanCache();