Кеширование



Простой кеш

Данные будут обновляться раз в 36000 ($cacheTtl)  секунд
$cache = \Bitrix\Main\Data\Cache::createInstance();  

$cacheTtl = 36000; // срок годности кеша в секундах
$cacheKey = 'mykey'; // ключ кеша

if ($cache->initCache($cacheTtl, $cacheKey)){
    $result = $cache->getVars(); // Получаем переменные
    $cache->output(); // можем вывести html, а можем не выводить
}
elseif ($cache->startDataCache()){
    //наша сложная логика, которую хотим закешировать
    
    $result = [  ]; //переменная с результатами 
     
    echo 'можем допом что-то вывести:'; // а когда уже закешировано, то это вывести надо через $cache->output();
    echo date("d.m.Y H:i:s"); //например дату, по которой убедимся, что кеширование работает

    $cache->abortDataCache();     // Если что-то пошло не так и решили кеш не записывать         
    $cache->endDataCache($result);    // Всё хорошо, записываем кеш
}

//print_r($result);
Управляемый кеш
Для запуска механизма необходимо включить
включением Управляемого кеша на закладке Управляемый кеш на странице Настройки > Настройки продукта > Автокеширование
или определить константу в файле dbconn.php.
dbconn.php
define("BX_COMP_MANAGED_CACHE", true); 
работа с кешем
$cache = \Bitrix\Main\Application::getInstance()->getManagedCache();

$cacheTtl = 36000; // срок годности кеша в секундах
$cacheId  =  'mykey'; // ключ кеша

if ($cache->read($cacheTtl, $cacheId)) {
   $result = $cache->get($cacheId); // достаем переменные из кеша
} 
else {
     //наша сложная логика, которую хотим закешировать
     $result = []; //переменная с результатами 
     $cache->set($cacheId, $result); // записываем в кеш
}

//print_r($result);
очистить кеш по ключу из любого места
$cache->clean($cacheId);
Тегированный кеш
$cache = \Bitrix\Main\Data\Cache::createInstance(); // Служба кеширования
$taggedCache = \Bitrix\Main\Application::getInstance()->getTaggedCache(); // Служба пометки кеша тегами
 

$cachePath = '/my/cache/path';
$cacheTtl = 3600; //время кеша в секундах
$cacheKey = 'mykey';
 
if ($cache->initCache($cacheTtl, $cacheKey, $cachePath)) {
    $result = $cache->getVars();
    $cache->output(); //можно вывести данные в браузер
 
    
} 
elseif ($cache->startDataCache()) {
    
    $taggedCache->startTagCache($cachePath); //одинаковый с $cache->initCache
    //наша логика
    $result = []; //формируем результат

    echo "hello world"; //можно что-то вывести
 
    // Добавляем теги    
    $taggedCache->registerTag('iblock_id_'.$iblockId); //кеш будет автоматически сбрасываться при изменении данных в выбранном инфоблоке    
    $taggedCache->registerTag('iblock_id_'.$iblock2Id); //можно и еще другой инфоблок добавить
    $taggedCache->registerTag('my_custom_tag');//свой тег, по котором можно сбрасывать
    
    //сбросить кеш, если что-то не так
    $taggedCache->abortTagCache();
    $cache->abortDataCache();
    
 
    // Всё хорошо, записываем кеш
    $taggedCache->endTagCache();
    $cache->endDataCache($result);
}
 
//print_r($result);
в любом месте можно сбросить любой тегированный кеш (и по своему тегу и по битриксовскому)
$taggedCache = \Bitrix\Main\Application::getInstance()->getTaggedCache();
$taggedCache->clearByTag('my_custom_tag');
$taggedCache->registerTag('iblock_id_'.$iblockId);

старое апи
Сache Dependencies (тегированный кеш) - статья битрикса
$cacheTime = 3600; //в секундах
$cacheId = 'myUniqueCacheId';
$cachePath = '/my/cache/path';
$cache = new CPHPCache();

if ($сache->InitCache($cacheTime, $cacheId, $cachePath)){
      $result = $сache->GetVars();
}
elseif($cache->StartDataCache()){   
   global $CACHE_MANAGER;
   $CACHE_MANAGER->StartTagCache($cachePath);
   
   
   //наша логика 
   //формируем $result
   $result = []; 
   
   //добавляем теги
   $CACHE_MANAGER->RegisterTag('iblock_id_' .$iblockId); //автоматически кеш будет сбрасываться при изменении данных в инфоблоке  $iblockId
   $CACHE_MANAGER->RegisterTag("iblock_id_new"); //автоматически кеш сбрасываться при добавлении инфоблоков
   $CACHE_MANAGER->RegisterTag('myTag'); //любой свой, который только вручную сбрасывать
     
   $CACHE_MANAGER->EndTagCache(); //Финализируем тегирование кеша
     

   $cache->EndDataCache($result);
     
}
else{
   $result = []; 
}
//print_r($result);

Стандартные теги в Битрикс по модулям
к которым можно привязать тегированный кеш и они автоматом будут срабатывать

Инфоблоки (iblock)
  • iblock_property_enum_{$propertyId} - при изменении свойства типа перечисление
  • iblock_id_new - при добавлении инфоблоков
  • iblock_id_{$iblockId} - при изменении инфоблока
Главный модуль (main)
  • RV_CACHE - при удалении пользователем оценки
  • {$componentName} - при очистке кеша компонента
  • USER_CARD_{$chunkNum} - при изменении пользователя, где $chunkNum = (int) $userId / TAGGED_user_card_size; Кеш не на отдельных пользователей, а на пачку
  • USER_CARD - при редактировании пользователя с битриксовой авторизацией
  • EXTERNAL_USER_CARD - при редактировании пользователя с внешней авторизацией
  • USER_NAME_{$userId} - при изменении пользователя. При обновлении может вызываться не всегда, а только если передано хотя бы одно из следующих полей: NAME, LAST_NAME, SECOND_NAME, ACTIVE, LOGIN, EMAIL, PERSONAL_GENDER, PERSONAL_PHOTO, WORK_POSITION, PERSONAL_PROFESSION, PERSONAL_WWW, PERSONAL_BIRTHDAY, TITLE, EXTERNAL_AUTH_ID, UF_DEPARTMENT, AUTO_TIME_ZONE, TIME_ZONE, TIME_ZONE_OFFSET
Веб формы (form)
  • form_{$formId} - при изменении формы, где {$formId} - ID формы.
Интернет магазин (sale)
  • sale-location-data - при изменении местоположений
Универсальные списки (lists)
  • LISTS_ELEMENT_LIVE_FEED - помечается, но не чистится
  • lists_list_{$iblockId} - очищается при редактировании списка, который работает через инфоблок $iblockId
  • lists_list_any - чистится при редактировании любого списка
Веб-мессенджер (im)
  • IM_CONTACT_LIST - при изменении цвета статуса пользователя
Блог (blog)
  • blog_post_{$postId} - при изменении поста
  • blog_post_getsocnetperms_{$postId} - при изменении прав поста (при присваивании определенным постам привязок к рабочим группам)
Обучение (learning)
  • {$entityTypeId}{$entityId} - при добавлении оценки сущностям, чьи $entityTypeId равны LEARN_CHAPTER, LEARN_LESSON, LEARN_COURSE. LEARN_COURSE{$courseId} - При обновлении курса
  • LEARNING_GROUP_{(int) $groupId / 100} - обновление кеша сотни группы. При добавлении/изменении/удалении группы
  • LEARNING_GROUP - При добавлении/изменении/удалении групп
rest
  • bitrix24_left_menu - при смене прав приложения через Bitrix\Rest\AppTable::setAccess()
wiki
  • wiki_{$wikiId} - при изменении вики страницы
forum
  • forum_{$forumId}
  • forum_topic_{$topicId}
  • forum_msg_count{$forumId} - при изменений сообщений форума
Социальная сеть (socialnetwork)
  • SONET_LOG_{$logId} - при изменении записи в живой ленте
  • sonet_features_{$entityType}_{$entityId} - при добавлении функционала группе sonet_feature_{$featureId} - при добавлении права на функционал
  • sonet_features2perms_{$permId} - при удалении права на функционал
  • sonet_search_{$entityType}_{$entityId}
  • sonet_user2group_G{$groupId} - при изменении членства пользователей в группах. При удалении группы sonet_user2group_U{$userId} - при изменении членства пользователей в группах
  • sonet_user2group - при изменении членства пользователей в группах. При удалении группы sonet_group_view_U{$userId}
  • sonet_group_{$groupId} - при удалении группы
  • sonet_group - при удалении группы
  • sonet_group_activity - при установке активности группы
  • sonet_subscription_{$subscriptionCode} - при добавлении, обновлении подписки. При удалении подписки с указанием кода. При удалении через указание ID не вызывается
  • sonet_subscription - при удалении всех подписок некоего пользователя
  • SONET_LOG_FOLLOW_{$userId} - при изменении подписок пользователя в живой ленте
  • blogpost_important_all - при редактировании важных записей
  • {$optionName}{$postId} - при редактировании опций блога пользователя
  • {$optionName}{$postId}_{$userId}} - при редактировании опций блога пользователя {$optionName}_USER_{$userId}} - при редактировании опций блога пользователя
Календарь (calendar)
  • calendar_user_{$userId} - при изменении событий в календаре пользователя
  • CALENDAR_EVENT_LIST - при изменении раздела в календаре
Голосования (vote)
  • vote_form_channel_{$voteId} - при изменении каналов голосования
  • vote_form_vote_{$voteId} - при изменении голоса, вопросов
  • vote_form_question_{$voteId} - при изменении вопросов, ответов
  • vote_form_answer_{$voteId} - устаревшее
landing
  • landing_page_{$landingId} - при изменении лендинга
Пример:
Как чистит кеш битрикс в Настройки > Настройки продукта > Автокеширование
//меню
if($_REQUEST["cachetype"] == "menu"){
  $GLOBALS["CACHE_MANAGER"]->CleanDir("menu");
  CBitrixComponent::clearComponentCache("bitrix:menu");
}

//весь управляемый
elseif($_REQUEST["cachetype"] == "managed"){
  $GLOBALS["CACHE_MANAGER"]->CleanAll();
  $GLOBALS["stackCacheManager"]->CleanAll();
}
//Все страницы HTML кеша
elseif($_REQUEST["cachetype"] == "html"){
  $page = \Bitrix\Main\Composite\Page::getInstance();
  $page->deleteAll();
}
//Все
elseif($_REQUEST["cachetype"] == "all"){
  BXClearCache(true);
  $GLOBALS["CACHE_MANAGER"]->CleanAll();
  $GLOBALS["stackCacheManager"]->CleanAll();
  $taggedCache = \Bitrix\Main\Application::getInstance()->getTaggedCache();
  $taggedCache->deleteAllTags();
  $page = \Bitrix\Main\Composite\Page::getInstance();
  $page->deleteAll();
}
Если блог был полезным, можете угостить меня "чашечкой кофе" :)

Сбер по номеру телефона +7 (953) 585-13-09 Вероника.
Спасибо!