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

12.11.2018

Теги: CMScomponent_epilog.phpresult_modifier.phpWeb-разработкаБитриксКешированиеКомпонентОтложенныеФункции

В компонентах есть встроенная поддержка типичного алгоритма кеширования. Если есть валидный кеш, то метод 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 • Отложенные функции

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.