Битрикс. Кеширование в компонентах
12.11.2018
Теги: CMS • component_epilog.php • result_modifier.php • Web-разработка • Битрикс • Кеширование • Компонент • ОтложенныеФункции
В компонентах есть встроенная поддержка типичного алгоритма кеширования. Если есть валидный кеш, то метод StartResultCache()
отправляет в браузер его содержимое, заполняет $arResult
и возвращает false
. Если нет валидного кеша, то метод возвращает true
— это значит, настало время актуализировать кеш.
Кеширование $arResult и html-кода
В большинстве стандартных компонентов битрикс используется одновременно кеширование массива $arResult
и html-кода:
/* * Подготовка входных параметров компонента */ // время кеширования if (!isset($arParams['CACHE_TIME'])) { $arParams['CACHE_TIME'] = 3600; } else { $arParams['CACHE_TIME'] = intval($arParams['CACHE_TIME']); } // идентификатор элемента инфоблока $arParams['ELEMENT_ID'] = empty($arParams['ELEMENT_ID']) ? 0 : intval($arParams['ELEMENT_ID']); if ($this->StartResultCache()) { /* * Если нет валидного кеша — получаем данные из БД */ if ( ! \Bitrix\Main\Loader::includeModule('iblock')) { $this->AbortResultCache(); ShowError('Модуль «Информационные блоки» не установлен'); return; } if ($arParams['ELEMENT_ID']) { // выполняем запрос к базе данных $rsElement = CIBlockElement::GetList( array(), // сортировка $arFilter, // фильтр false, // группировка false, // постраничная навигация $arSelect // поля ); if ($arResult = $rsElement->GetNext()) { /* * Добавляем в массив arResult дополнительные элементы, * которые могут потребоваться в шаблоне */ } } if (isset($arResult['ID'])) { // данные получены успешно /* * Ключи $arResult, перечисленные при вызове этого метода, * будут доступны в component_epilog.php и ниже по коду; * обратите внимание, там уже будет другой $arResult */ $this->SetResultCacheKeys( array( 'ID', 'NAME' ) ); // подключаем шаблон и сохраняем кеш $this->IncludeComponentTemplate(); } else { // что-то пошло не так $this->AbortResultCache(); \Bitrix\Iblock\Component\Tools::process404( 'Страница не найдена', true, true ); } } /* * Кэш не затронет весь код ниже, он будут выполняться на каждом хите, но * здесь работаем уже с другим $arResult — будут доступны только те ключи * массива, которые перечислены в вызове SetResultCacheKeys() */ if (isset($arResult['ID'])) { // счетчик просмотров элемента CIBlockElement::CounterInc($arResult['ID']); // устанавливаем заголовок страницы $APPLICATION->SetTitle($arResult['NAME']); }
bool CBitrixComponent::StartResultCache( int cacheTime, string additionalCacheID, string cachePath )
Метод поддержки внутреннего кеширования компонента. Возвращает true
в случае, если кеш недействителен, или false
в противном случае.
Если кеш действителен, метод отправляет на экран его содержимое, заполняет $arResult
и возвращает false
. Если кеш недействителен, метод возвращает true
, кеширование завершается и кеш сохраняется при вызове методов
CBitrixComponent::IncludeComponentTemplate()
- или
CBitrixComponent::ShowComponentTemplate()
сразу после подключения шаблона компонента.
Параметры
cacheTime
— Время кеширования в секундах. Если этот параметр равенfalse
, то время кеширования берется из входного параметра$arParams['CACHE_TIME']
. Необязательный.additionalCacheID
— Кеш зависит от текущего сайта (SITE_ID
), имени компонента, имени шаблона, входных параметров$arParams
. Если кеш должен зависеть от каких-либо дополнительных параметров, то их необходимо передать сюда в виде строки. По умолчанию параметр равенfalse
, т.е. кеш зависит только от текущего сайтаSITE_ID
, имени компонента, имени шаблона и входных параметров$arParams
. Необязательный.cachePath
— Путь к файлу кеша относительно папки кешей. Необязательный.
Кеширование только $arResult
При написании собственных компонентов кеширование html-кода не всегда удобно — иногда бывает нужно в шаблоне выполнять какой-то код на каждом хите. В этом случае можно кешировать только $arResult
:
if ($this->StartResultCache()) { if ( ! \Bitrix\Main\Loader::includeModule('iblock')) { $this->AbortResultCache(); ShowError('Модуль «Информационные блоки» не установлен'); return; } /* * Здесь получаем данные из БД */ // сохраняем полученные данные в кеш $this->EndResultCache(); } $this->IncludeComponentTemplate();
Обратите внимание — подключение шаблона производится вне блока кеширования, а его место занимает EndResultCache()
.
Файл component_epilog.php
Файл component_epilog.php
подключается после файла шаблона template.php
и никогда не кешируется, т.е. он отработает независимо от того, был показан только что созданный html-код или вывод из кеша. Соответственно, можно использовать этот файл для выполнения каких-то действий на каждом хите — например, выводить html-код выше на странице, используя отложенные функции.
Отложенные функции — технология, позволяющая задавать заголовок страницы, пункты навигационной цепочки, CSS стили, дополнительные кнопки в панель управления, мета-теги и т.п. с помощью функций, используемых непосредственно в теле страницы. Соответствующие результаты работы этих функций выводятся в прологе, то есть выше по коду, чем они были заданы.
Технология была создана в первую очередь для использования в компонентах, которые, как правило, выводятся в теле страницы, но при этом внутри них могут быть заданы заголовок страницы, добавлен пункт в навигационную цепочку, добавлена кнопка в панель управления и так далее. Отложенные функции нельзя использовать в файлах шаблона компонента template.php
и result_modifier.php
(так как результаты их выполнения кешируются).
Но в нативных компонентах данные, доступные в component_epilog.php
, как правило, весьма ограничены — доступны лишь ключи $arResult
, перечисленные при вызове SetResultCacheKeys()
. Вносить свой код в компонент не имеет смысла — он может быть перезаписан при обновлении Битрикс. Можно еще скопировать компонент в свое пространство имен и вносить изменения в копию, но тогда будут недоступны обновления.
Однако, можно расширить перечень этих ключей, не затрагивая код компонента. Для этого копируем шаблон компонента, создаем файл result_modifier.php
и добавляем в него код:
<?php if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true) die(); // добавляем ключ SECTION в массив $arResult $this->__component->SetResultCacheKeys(array('SECTION'));
Очистить кеш компонента
Если при выполнении некоторых условий нужно очистить кеш компонента (например, компонент знает, что данные изменились), то можно воспользоваться методом
$this->ClearResultCache($additionalCacheID = false, $cachePath = false)
Дополнительно
Поиск: CMS • Web-разработка • Битрикс • Кеширование • Компонент • component_epilog.php • result_modifier.php • StartResultCache • AbortResultCache • SetResultCacheKeys • EndResultCache • ClearResultCache • $arResult • Отложенные функции