Проблема: у нас, например, есть 10 отдельных кешируемых страниц, нам надо сбрасывать разом весь их кеш. Без тегированного кеша надо знать все ключи и перебирая их сбрасывать. Добавляя 11 страницу, нам надо не забыть добавить его ключ в сбрасыватель кеша, что легко забыть, или сайт начнет выдавать баги.
Тут нам помогает тегированный кеш. При генерации страниц, мы помечаем данные одним общим тегом и по нему сбрасываем кеш. Добавляя 11 страницу, мы добавляем на странице общий тег и эта страница начинает сбрасываться автоматически.
use \Bitrix\Main\Data\Cache;
use \Bitrix\Main\Application;
$cache = Cache::createInstance(); // Служба кеширования
$taggedCache = Application::getInstance()->getTaggedCache(); // Служба пометки кеша тегами
/*
* Чтобы тегированный кеш нашел что ему сбрасывать, необходим
* одинаковый путь в $cache->initCache() и $taggedCache->startTagCache()
* У нас путь указан в $cachePath
*/
$cachePath = 'mycachepath';
$cacheTtl = 3600;
$cacheKey = 'mycachekey';
if ($cache->initCache($cacheTtl, $cacheKey, $cachePath))
{
$vars = $cache->getVars();
/*
* Еще тут можно вывести данные в браузер, через $cache->output();
* Тогда получится замена классу CPageCache
*/
}
elseif ($cache->startDataCache())
{
// Начинаем записывать теги
$taggedCache->startTagCache($cachePath);
$vars = [
'date' => date('r'),
'rand' => rand(0, 9999), // Если данные закешированы - число не будет меняться
];
// Добавляем теги
// Кеш сбрасывать при изменении данных в инфоблоке с ID 1
$taggedCache->registerTag('iblock_id_1');
// Кеш сбрасывать при изменении данных в инфоблоке с ID 2
$taggedCache->registerTag('iblock_id_2');
// Если что-то пошло не так и решили кеш не записывать
$cacheInvalid = false;
if ($cacheInvalid)
{
$taggedCache->abortTagCache();
$cache->abortDataCache();
}
// Всё хорошо, записываем кеш
$taggedCache->endTagCache();
$cache->endDataCache($vars);
}
// Данные будут обновляться раз в час или при обновлении данных в инфоблоках 1 и 2
print_r($vars);
Когда необходимо сбросить кеш по тегу:
use \Bitrix\Main\Application;
$taggedCache = Application::getInstance()->getTaggedCache(); // Служба пометки кеша тегами
/*
* Где-то на отдельной странице чистим кеш по тегу
*/
$taggedCache->clearByTag('iblock_id_28');
Как сделать чтобы мой кеш сбрасывался автоматически, при изменении данных в инфоблоке? Использовать готовые теги: iblock_id_{ID} - это зарезервированные теги битрикса для инфоблоков, сброс кеша по этим тегам уже есть в классах работы с инфоблоками. iblock_id_new - по этому тегу кеш сбрасывается при создании инфоблоков. Списка используемых тегов в битрикс я не нашел.
Для себя вы можете придумать свои теги.
Везде пишут что, чтобы работало всё это чудо, надо добавить в dbconn.php строку: define("BX_COMP_MANAGED_CACHE", true); Но у меня и без нее всё работает
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».