Войти

Что вас интересует?

Кеширование в компонентах Битрикс

В компонентах есть встроенная поддержка типичного алгоритма кеширования. Если есть валидный кеш, то метод 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 и ниже по коду;
$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']);
}

Метод поддержки внутреннего кеширования компонента StartResultCache. Возвращает true в случае, если кеш недействителен, или false в противном случае.

Если кеш действителен, метод отправляет на экран его содержимое, заполняет $arResult и возвращает false. Если кеш недействителен, метод возвращает true, кеширование завершается и кеш сохраняется при вызове методов сразу после подключения шаблона компонента:

  1. CBitrixComponent::IncludeComponentTemplate()
  2. CBitrixComponent::ShowComponentTemplate()
bool CBitrixComponent::StartResultCache(
int cacheTime,
string additionalCacheID,
string cachePath
)
Параметры:
  • 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 и добавляем в него код:

if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true) die();
// добавляем ключ SECTION в массив $arResult
$this->__component->SetResultCacheKeys(array('SECTION'));

Очистить кеш компонента

Если при выполнении некоторых условий нужно очистить кеш компонента (например, компонент знает, что данные изменились), то можно воспользоваться методом:

$this->ClearResultCache($additionalCacheID = false, $cachePath = false)

Комментрии
Комементариев нет, будьте первыми....
Оставить комментарий
Пожалуйста, введите ваше Имя.
Пожалуйста, введите ваш Email.
Пожалуйста, напишите комментарий.