Bitrix D7: тегированный кеш HighloadBlock — авто-инвалидирование при изменении д
Сниппет показывает, как кэшировать выборку Highload-блока и автоматически очищать её с помощью тегов при добавлении или обновлении записей.
**Почему это полезно**
Выборка Heavy HL-блока хранится час, но как только администратор меняет данные, обработчик события сбрасывает только связанный тег — страницы моментально получают актуальную информацию без полного обнуления кеша.
<?php
use Bitrix\Main\Data\Cache;
use Bitrix\Main\Loader;
use Bitrix\Main\Application;
Loader::includeModule('highloadblock');
$hlId = 12;
$ttl = 3600;
$cacheId = "hl_$hlId";
$cacheDir = '/hl/tagged/';
$tag = "hl_table_$hlId";
$cache = Cache::createInstance();
if ($cache->initCache($ttl, $cacheId, $cacheDir)) {
$rows = $cache->getVars();
} elseif ($cache->startDataCache()) {
// Начинаем тег-кеш
$taggedCache = Application::getInstance()->getTaggedCache();
$taggedCache->startTagCache($cacheDir);
$taggedCache->registerTag($tag);
// «Тяжёлый» запрос
$rows = \Bitrix\Highloadblock\HighloadBlockTable::compileEntity($hlId)
->getDataClass()::getList([
'select' => ['ID', 'UF_NAME', 'UF_PRICE']
])->fetchAll();
$taggedCache->endTagCache();
$cache->endDataCache($rows);
}
// Выводим данные
foreach ($rows as $row) {
echo $row['UF_NAME'].' — '.$row['UF_PRICE']."₽<br>";
}
/* ── В файле /local/php_interface/init.php ──
AddEventHandler('highloadblock', 'OnAfterHlBlockUpdate', function ($arFields) {
\Bitrix\Main\Application::getInstance()->getTaggedCache()
->clearByTag("hl_table_".$arFields['ID']);
});
*/