Простой кеш
$cache = \Bitrix\Main\Data\Cache::createInstance(); |
получить и закешировать данные или вернуть из кеша
Данные будут обновляться раз в 36000 ($cacheTtl) секунд
//обязательные
$cacheTtl = 36000; // срок годности кеша в секундах
$cacheKey = 'mykey'; // ключ кеша
//необязательные
$cacheDir = 'myDir'; //директория - если не указано, то будет default
$cacheBaseDir = 'myBaseDir'; //директория - если не указано, то будет cache
if ($cache->initCache($cacheTtl, $cacheKey)){ //$cache->initCache($cacheTtl, $cacheKey,$cacheDir,$cacheBaseDir)
$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);
|
сбросить по ключу кеша
$cache->clean($cacheKey); //clean($uniqueString, $initDir = false, $baseDir = 'cache') |
сбросить папку с кешем
$cache->cleanDir($cacheKey); //cleanDir($initDir = false, $baseDir = 'cache') |
Управляемый кеш
Для запуска механизма необходимо включить включением Управляемого кеша на закладке Управляемый кеш на странице Настройки > Настройки продукта > Автокеширование или определить константу в файле 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 = \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); |
старое апи
$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();
} |