В 1С-Битрикс для уменьшения времени повторного создания страниц сайта используется механизм кеширования. Кеш позволит сохранить результат выполнения компонента - html шаблона, данные для заполнения метаданных страницы. Сайту не потребуется выполнять множество запросов к базе данных, расчет скидок и формирование шаблона на каждый хит.
Обратитесь в «Техдиректор» за помощью, если сталкиваетесь с проблемой долгого формирования страницы вашего сайта.
Методы создания кеша компонента
Для начала кеширования данных вызывается метод CBitrixComponent::StartResultCache(…) в качестве условия оператора if. Если данные в кеше актуальны, метод вернет false и тело оператора if будет пропущено.
Запись данных в кеш происходит при вывозе методов CBitrixComponent::EndResultCache() или CBitrixComponent::IncludeComponentTemplate(...). Метод должен быть расположен последним внутри блока if с вызовом метода CBitrixComponent::StartResultCache(…).
Пример кеширования с html-шаблоном:
if ($this->StartResultCache($arParams['CACHE_TIME'], [ ...$additionalCacheId ]))
{
// загрузка данных
$this->IncludeComponentTemplate(); // кеширование $arResult и html-шаблона
}
// установка мета-данных страницы
Пример кеширования только $arResult:
if ($this->StartResultCache($arParams['CACHE_TIME'], [ ...$additionalCacheId ]))
{
// загрузка данных $arResult для кеширования
$this->EndResultCache(); // кеширование только $arResult
}
// обработка запроса пользователя
$this->IncludeComponentTemplate();
HTML-шаблон одинаков для большой группы пользователей
Пользователь может сделать выбор, ввести данные
Данные в кеше
HTML-шаблона, $arResult, $templateData
$arResult
Выполнение result_modifier.php и template.php
Один раз
Каждый хит
Параметры запроса $_REQUEST, $_GET, $_POST, $_SESSION, $USER в result_modifier.php и template.php
Передавать в параметрах вызова компонента $arParams с приведением значения по допустимому списку вариантов.
Пример - вариант отображения списка или сортировка.
Без ограничений. Для вывода использовать функцию htmlspecialcharsbx() (уязвимость XSS).
Рекомендуется использовать данные $arResult.
Глобальные переменные (например, $APPLICATION) в result_modifier.php и template.php
Сохранить данные в $arResult или $templateData. Выполнить в component_epilog.php ^1.
Например, установка заголовка страницы ^2.
Без ограничений
Кеширование дополнительной выборки в result_modifier.php и template.php
Не требуется
Требуется
^1 - для вложенных компонентов component_epilog.php выполнится, если при вызове [$APPLICATION->IncludeComponent(...)](https://dev.1c-bitrix.ru/api_help/main...ponent.php) передан аргумент $parentComponent. ^2 - обратите внимание, после component_epilog.php будет выполнен код компонента, расположенный ниже вызова метода CBitrixComponent::IncludeComponentTemplate(...), поэтому для установки метаданных может потребоваться изменить $component->arResult, т.к. компонент выполнит функции позже и переопределить глобально установленные значения.
Хранение кеша
Путь к файлу кеша формируется из директории кеша и md5-хеша идентификатора кеша.
По умолчанию директория кеша выглядит как bitrix/cache/{siteId}/{relativeComponentPath}/{salt} (например, bitrix/cache/s1/bitrix/catalog.smart.filter/59d). Переопределить директорию кеша компонента можно, передав аргумент $cachePath для метода CBitrixComponent::StartResultCache(…).
Идентификатор кеша, позволяет отличить файл кеша для вызова компонента в разных областях страницы и параметрах окружения. По умолчанию зависит от значений всех параметров компонента, идентификатора сайта, языка, шаблона сайта, временной зоны и порядковому номеру вызова на странице данного компонента. Разработчик может добавить собственные аргументы в идентификатор кеша, передав аргумент $additionalCacheID для метода CBitrixComponent::StartResultCache(…) (например, группы пользователя в зависимости от параметра CACHE_GROUPS).
Идентификатор кеша формируется в методе CBitrixComponent::GetCacheID(), может быть переопределен в собственном компоненте. В стандартных компонентах метод GetCacheID изменен только в компонентах bitrix:menu и bitrix:intranet.contact_center.list.
В качестве хранения системы хранения кеша можно выбрать Memcached или Redis. Обратите внимание, не рекомендуется использовать динамический sid для сайтов с многосайтовостью. Возможна проблема сброса кеша только по одному ключу sid.
Время кеширования
Время кеширования для компонентов с поддержкой тегированного кеша можно выбрать достаточно большим (например, один день). В случае изменения данных 1С-Битрикс автоматически отметит связанный кеш для удаления. По умолчанию при выборке данных из инфоблока [CIBlockResult::Fetch()](https://bxapi.ru/src/?module_id=iblock...3A%3AFetch) регистрируется тег инфоблока, поэтому вызов $CACHE_MANAGER->RegisterTag(...) необязателен. Стоить обратить внимание, что тег кеша скидок не регистрируется, поэтому при изменении скидок потребуется сбросить кеш вручную.
Особенность тегированного кеша 1С-Битрикс состоит в том, что при изменении любого товара, происходит сброс кеша всего каталога. Что приводит к проблеме, если при максимальной активности посетителей, изменения товаров происходят с периодичностью несколько раз в минуту. В таком случае рекомендуем выбрать время кеширования от 10 минут до 1 часа и отключить автоматическое тегирование перед вызовом компонента каталога.
В кеше стоит хранить компоненты на часто посещаемых страницах сайта и одинаковых для большой группы пользователей. Поэтому:
Кеширование при установленном фильтре (параметр CACHE_FILTER) стоит отключить по умолчанию. Включать, если используете дополнительный фильтр по умолчанию (заполняете $GLOBALS[$arParams['FILTER_NAME']]) и не выбраны дополнительные условия в смарт-фильтре. Также стоит включить CACHE_FILTER для страниц, ссылки на которые размещены на странице раздела в качестве тегов или используются в рекламе.
Список товаров в поиске также не стоит кешировать, т.к. кеш будет разным для каждого уникального запроса пользователя.
В персональном разделе покупателя использовать кеширование компонентов по умолчанию не требуется.
Если в параметрах компонента передаете генерируемые данные, которые со временем больше не могут быть использованы. Например, в качестве параметра компонента используете результат функции date('Y-m-d'). В таком случае потребуется реализовать агент, который будет очищать устаревший кеш (на основе \Bitrix\Main\Data\Cache::clearCache(...)), чтобы избежать переполнения места на диске.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».