Параметры и кеширование собственного компонента 1С-Битрикс
Как подготовить параметры компонента, сформировать ключ кеша, применить StartResultCache и корректно сбрасывать кеш при изменении данных.
Системные требования
Нужны тестовая копия проекта, доступ разработчика или администратора и резервная копия перед изменением рабочего кода.
Смотреть системные требования1. Нормализуйте параметры
Метод onPrepareComponentParams() вызывается до основной логики. Приведите числа к int, ограничьте допустимые значения и задайте безопасные значения по умолчанию.
$arParams["LIMIT"] = max(1, min(100, (int)$arParams["LIMIT"]));
$arParams["CACHE_TIME"] = (int)($arParams["CACHE_TIME"] ?? 3600);Не передавайте необработанные параметры прямо в фильтр ORM или HTML.
2. Сформируйте безопасный ключ
Результат зависит не только от URL. Если компонент учитывает текущего пользователя, группу, язык, сайт или выбранный раздел, эти значения должны различать кеш.
Но не добавляйте в ключ случайные значения и текущее время: такой кеш никогда не будет повторно использован.
Совет
Кешируйте данные компонента, а не случайные побочные эффекты. Права пользователя и параметры, влияющие на результат, должны входить в ключ кеша.
3. Используйте StartResultCache
startResultCache() кеширует подготовленный arResult. Шаблон подключайте внутри успешной ветки:
if ($this->startResultCache()) {
$this->arResult["ITEMS"] = $this->getItems();
$this->includeComponentTemplate();
}Режим A использует общую настройку автокеширования, Y — принудительный кеш, N — без кеша.
4. Отменяйте пустой или ошибочный кеш
Если данные получить не удалось или сущность не найдена, вызовите AbortResultCache() до вывода сообщения. Иначе пустая или ошибочная страница сохранится на весь срок кеша.
if (!$item) {
$this->abortResultCache();
ShowError("Элемент не найден");
return;
}5. Подключите тегированный кеш
При управляемом кешировании зарегистрируйте тег, связанный с сущностью, и очищайте его после изменения данных.
$GLOBALS["CACHE_MANAGER"]->RegisterTag("catalog_item_".$id);
$GLOBALS["CACHE_MANAGER"]->ClearByTag("catalog_item_".$id);Используйте стабильные префиксы и не очищайте весь кеш сайта при изменении одного элемента.
Была ли эта статья полезной?
Спасибо за ваш отзыв!