Композитный кэш (Композитный сайт) отдаёт страницу как статический HTML, а изменяемые блоки догружает отдельными запросами. Это даёт скорость статики при сохранении динамики — но требует правильно размечать, что именно динамическое.
Что такое композит и чем он отличается от кэша
Обычное кэширование компонента хранит результат его работы и подставляет в страницу на сервере. Композит идёт дальше: он сохраняет всю готовую страницу как статический HTML и отдаёт её ещё до полной инициализации ядра — фактически как обычный файл.
Разница по слоям:
| Механизм | Что кэшируется | Где отдаётся |
|---|---|---|
| Кэш компонента | $arResult и HTML компонента | на сервере, внутри PHP |
| Композит | вся страница целиком | максимально рано, минуя тяжёлую логику |
Включается композит в настройках модуля main (раздел «Композитный сайт») в двух режимах: автоматический (кэшируется вся страница) и ручной (кэшируется только то, что вы явно пометили).
Динамические области
Поскольку композит отдаёт статику, всё, что должно меняться от пользователя к пользователю (корзина, имя в шапке, CSRF-токен, счётчики), нужно вынести в динамические области. Их Битрикс догружает отдельным AJAX-запросом уже после отдачи статики и подставляет в помеченные места.
Что почти всегда динамическое:
- мини-корзина и её сумма;
- блок авторизации / имя пользователя;
- формы с одноразовым токеном (
bitrix_sessid); - персональные рекомендации и «вы смотрели».
Выделение области через createFrame
В коде компонента или шаблона динамическая область оборачивается «фреймом». Современный API — метод createFrame() у объекта компонента:
<?php
$frame = $this->__component->createFrame()->begin('');
// ... вывод персонального блока ...
$frame->end();
Всё между begin() и end() исключается из статического HTML и подгружается отдельно. Для произвольного участка страницы (вне компонента) используется помощник:
<?php
$frame = new \Bitrix\Main\Page\FrameHelper('personal-block');
$frame->begin();
echo $personalHtml;
$frame->end();
Пока данные не подгрузились, во фрейме можно показать заглушку (stub) — например, спиннер, — передав её в begin().
Как отключить композит для страницы или блока
Иногда проще исключить страницу из композита целиком. Способы:
- константа на странице:
define('DISABLE_COMPOSITE', true);— до подключения пролога; - метод:
\Bitrix\Main\Composite\Helper::setEnable(false);; - в настройках композита — списком исключённых страниц и по маске URL.
Для отдельного компонента, который нельзя корректно закэшировать композитом, разумнее не выключать композит на всей странице, а обернуть проблемный блок в динамическую область. Полное отключение композита на популярной странице лишает вас основной выгоды по скорости.
Подводные камни
Композит меняет момент выполнения кода, и об этом легко забыть:
- Заголовки и SetTitle. Установленные внутри кэшируемого компонента, они «застынут» в статике. Персональные мета-теги ставьте вне кэша.
- Сессия и авторизация. Статическая страница отдаётся до старта тяжёлой логики; полагаться на
$USERв статической части нельзя. - JS-инициализация. Динамические области приходят позже, поэтому скрипты, работающие с ними, должны вешаться на событие готовности, а не выполняться сразу.
- Формы и токены.
bitrix_sessid()в статике устаревает — выводите токен в динамической области или обновляйте перед отправкой.
Отладка: в настройках композита есть режим, показывающий границы динамических областей, а в исходном коде страницы видны маркеры фреймов — по ним легко понять, что реально стало статикой.
Где хранится композитный кэш
Композит может хранить статику как в файлах, так и во внешнем хранилище. Для нагруженных проектов выбирают быстрый бэкенд:
| Хранилище | Когда |
|---|---|
| Файлы | простые проекты, один сервер |
| Memcached | нагрузка, несколько нод |
| Redis | кластер, отказоустойчивость, TTL |
Бэкенд настраивается в модуле main вместе с общим кэшем. На кластере важно, чтобы все ноды видели единое хранилище композита — иначе статику придётся генерировать на каждой ноде отдельно, теряя часть выгоды.
Итог
Композитный кэш отдаёт страницу как статику и догружает персональные блоки динамическими областями через createFrame() или FrameHelper. Главное правило — всё персональное (корзина, авторизация, токены) обязано быть динамической областью, иначе пользователи увидят чужие данные. Для быстрого хранилища на нагрузке подключают Memcached или Redis.
Правильно внедрённый композит вместе с грамотным кэшированием ускоряет сайт в разы. Мы в B2Bsite настраиваем композит и инфраструктуру под высокие нагрузки — от разметки динамических областей до кластера с общим хранилищем кэша.
Частые вопросы
Чем композит отличается от кэша компонента?
Кэш компонента хранит результат работы компонента внутри PHP. Композит сохраняет всю страницу как статический HTML и отдаёт её максимально рано, минуя тяжёлую логику ядра.
Что будет, если не пометить персональный блок динамическим?
Он попадёт в статику, и все пользователи увидят версию, закэшированную для первого посетителя — например, чужую корзину или чужое имя в шапке.
Как выделить динамическую область в компоненте?
Обернуть вывод в $this->__component->createFrame()->begin('') и закрыть end(). Всё между ними исключается из статики и догружается отдельным запросом.
Как полностью отключить композит для страницы?
Объявить define('DISABLE_COMPOSITE', true) до подключения пролога, вызвать Helper::setEnable(false) или добавить URL в список исключений в настройках композита.
Почему форма с bitrix_sessid ломается при композите?
Токен сессии застывает в статике и устаревает. Выводите его в динамической области или обновляйте перед отправкой формы.
Где хранить композитный кэш на нагруженном проекте?
В Memcached или Redis, а не в файлах. На кластере все ноды должны видеть единое хранилище композита.
Для каких страниц композит бесполезен?
Для полностью персонализированных, например личного кабинета: там почти всё динамическое, и статике нечего кэшировать.
Поможем с настройкой и поддержкой Для разработчиков
Поможем с настройкой, доработкой и поддержкой Для разработчиков.