Перейти к содержимому

Композитный сайт - включение, динамические области, сброс

Включаем композит без чужих имён в шапке: проверяем отдачу, помечаем личные блоки и разбираемся, чем сбрасывать готовые копии.

Решение

Проверяем, отдана ли страница из статики:

Окно терминала
curl -sI https://example.org/catalog/ | grep -i x-bitrix-composite
# Cache (dynamic) - страница взята из готовой копии
# заголовка нет вовсе - композит на этой странице не сработал
# счётчики показов внутри копии не растут: код на таком хите не выполняется

Служебный заголовок ответа сервера отвечает на главный вопрос сразу. Замер делают на втором обращении: первое собирает копию и по времени ничем не отличается от обычной страницы.

Помечаем личный блок в шаблоне компонента:

$frame = $this->createFrame()->begin(''); // здесь можно оставить заглушку
?>
<span class="cart-count"><?= $arResult['ITEMS_COUNT'] ?></span>
<?php
$frame->end();
// содержимое области придёт вторым запросом, уже персонально

Динамическая область вырезается из общей копии страницы и догружается отдельным запросом. Всё, что отличается у двух посетителей - корзина, имя, отложенные товары, - обязано быть внутри такой области.

Догружаем произвольный участок страницы:

$APPLICATION->AddBufferContent(function () {
global $USER;
return $USER->IsAuthorized() ? 'Здравствуйте, ' . $USER->GetFullName() : 'Войти';
});
// функция выполняется после сборки страницы, поэтому в статику её результат не попадает

Отложенный буфер закрывает те случаи, до которых компоненты не дотягиваются. Он же выручает там, где личное вставлено прямо в шаблон сайта и переносить его в компонент дороже, чем пометить.

Сбрасываем композитные копии:

$cache = \Bitrix\Main\Data\StaticHtmlCache::getInstance();
$cache->deleteEntry('/catalog/'); // одна страница
$cache->deleteAll(); // и всё разом, если менялся шаблон сайта
// то же самое доступно кнопкой в настройках модуля композита
// счётчики и события аналитики тоже переносят в динамические области

Композитные копии страниц живут отдельно от кэша компонентов. Сброс кэша компонентов их не трогает, и правка шаблона сайта доезжает до посетителя только после этого шага.

Включать композит стоит после того, как страница уже быстрая без него. На медленной странице он маскирует причину: посетителю быстро, а первый заход и любой сброс возвращают исходную секунду ожидания.

Личные данные проверяют не на глаз, а двумя разными браузерами. Достаточно открыть страницу гостем и авторизованным пользователем подряд, чтобы увидеть чужое имя в шапке, если область не помечена.

Композит спорит со счётчиками и с разметкой, зависящей от самого посетителя. Всё, что считает показы или подставляет город, переносят в динамические области заранее.

Список динамических областей стоит записать рядом с шаблоном сайта. Через месяц новый блок в шапке добавит человек, который про композит не помнит, и найдёт эту запись раньше, чем чужое имя увидит посетитель.

Типичные проблемы

Гость видит имя другого пользователя.

Личный блок с данными посетителя попал в общую копию страницы для всех. Каждое такое место на странице объявляют отдельной динамической областью.

Число товаров в корзине не меняется.

Счётчик корзины попал в общую статику и отдаётся всем посетителям одним и тем же. Счётчик обязан приходить вторым запросом, уже после показа страницы.

Правка шаблона не видна на сайте.

Страница отдаётся посетителю из композитной копии, собранной ещё до вашей правки шаблона. Композитные копии страниц сбрасывают отдельно от кэша самих компонентов.

Композит не срабатывает на нужной странице.

Код страницы отдаёт свои заголовки или пишет в сессию. Такие страницы платформа в композитную статику не кладёт и собирает их каждый раз.

Статистика показов просела после включения.

Счётчик стоит в статической части и не выполняется при отдаче копии. Такой счётчик переносят внутрь динамической области вместе с его разметкой.

Частые вопросы

Сколько места занимают композитные копии?

На каталоге с фильтром - заметно много: копия на каждую комбинацию. Объём стоит смотреть после первой недели.

Работает ли композит для авторизованных?

Да, общая часть страницы отдаётся так же. Личное при этом обязано быть в динамических областях.

Как отключить композит на одной странице?

Настройкой модуля по маске адреса. Точечное отключение честнее, чем попытка пометить на ней всё подряд.

Что делать со страницами оформления заказа?

Оставлять их вне композита. Они целиком личные, и выигрыша там нет.

Смежное

Первоисточник