Битрикс. Композитный сайт. Часть 1 из 3

17.11.2018

Теги: AJAXCMSWeb-разработкаБитриксКешированиеКомпозитныйСайтНастройка

Как это работает

Многие элементы страниц сайта выглядят одинаково, например, шапка и подвал. У композитного сайта данные, одинаковые для всех пользователей (статические) хранятся в виде html-файла на сервере (кеш). И могут быть отданы сразу, без выполнения php-кода и запросов к базе данных. Данные, которые у пользователей различаются (корзина, личный кабинет) подгружаются в фоновом режиме, когда HTML уже отобразился в браузере. Эти данные называются динамическими. Параллельно с ними загружаются CSS, Javascript, шрифты, изображения.

При фоновом ajax-запросе Битрикс формирует страницу полностью. Из полученного html-кода вырезаются динамические данные и отправляются браузеру в формате json. Браузер вставляет полученные от сервера актуальные данные вместо специальных заглушек. А на сервере тем временем происходит обратный процесс — на место вырезанных динамических данных вставляются заглушки. После замены всей динамики на статику, считается контрольная сумма получившейся страницы. Если эта сумма не совпадает с контрольной суммой страницы в кеше — кеш перезаписывается.

В каком месте html-кода производить замены (на клиенте и на сервере) — задает программист специальной разметкой.

Страницу из кеша сервер отправляет браузеру с заголовком Last-Modified, который сообщает дату последнего изменения страницы — это дата создания файла на диске. Когда браузер получает ответ с таким заголовком, то последующие свои запросы этой страницы он делает с заголовком If-Modified-Since — изменилась страница после даты Last-Modified? И если страница не изменилась, то сервер вместо страницы отдает код 304 Not Modified, а браузер берет страницу из локального кеша.

Быстрый старт

Для удобства, работать будем сразу в двух браузерах. В браузере Firefox будем задавать настройки в панели управления, смотреть список закешированных страниц, запускать отладку. А в браузере Chrome с установленным плагином «Bitrix Composite Notifier» — проверять работу сайта в композитном режиме, как неавторизованный пользователь.

В панели управления переходим на страницу «Настройки • Настройки продукта • Композитный сайт • Настройка», открываем вторую вкладку «Композит», нажимаем кнопку «Включить композит».

На вкладке «Настройки» устанавливаем

  • Голосование шаблона компонента по умолчанию — «против», т.е. шаблоны будем настраивать сами
  • Режим перезаписи кеша — стандартный

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

  • _NCC (No Composite Cache) — для пользователей, которым страница не должна отображаться в композитном режиме
  • _CC (Composite Cache) — для пользователей, которым страница должна отображаться в композитном режиме

Тестовый сайт у меня самый простой, все страницы статические, и только одна использует самописный комплексный компонент. Этот компонент умеет показывать раздел инфоблока, отдельный элемент инфоблока и главную страницу (корневые разделы инфоблока + популярные элементы). Мы в настройках композита задали, что шаблон компонента всегда голосует против композита, поэтому для каждого простого компонента, входящего в состав комплексного, надо переопределить это значение по умолчанию. Просто добавить строчку $this->setFrameMode(true);, например:

<?php
/*
 * Файл local/components/tokmakov/iblock/templates/.default/tokmakov/iblock.element/.default/template.php
 */
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true) die();

// Шаблон компонента голосует за композит — шаблон
// статичный, и его можно записывать в кеш.
$this->setFrameMode(true);
?>

<h1><?= $arResult['NAME']; ?> [Комплексный]</h1>
<article id="iblock-element">
    <?php if (!empty($arResult['DETAIL_PICTURE'])): ?>
        <img src="<?= $arResult['DETAIL_PICTURE']['SRC']; ?>"
             alt="<?= $arResult['DETAIL_PICTURE']['ALT']; ?>"
             title="<?= $arResult['DETAIL_PICTURE']['TITLE']; ?>" />
    <?php endif; ?>
    <p>Количество просмотров: <?= $arResult['SHOW_COUNTER'] ? $arResult['SHOW_COUNTER'] : 0; ?></p>
    <?php if (!empty($arResult['DETAIL_TEXT'])): ?>
        <div>
        <?= $arResult['DETAIL_TEXT'] ?>
        </div>
    <?php endif; ?>
    <p><a href="<?= $arResult['SECTION']['SECTION_PAGE_URL']; ?>">Назад в раздел</a></p>
</article>
Страница попадает в кеш, если все компоненты, размещенные на странице, проголосовали за композит. В том числе «за» должны проголосовать и компоненты, подключение которых происходит в шаблонах сайта (header.php и footer.php), а не только те, которые расположены в рабочей области #WORK_AREA#.

Вроде бы все готово, можно проверять. Заходим на страницу этого самописного комплексного компонента как не авторизованный пользователь, и просматриваем три страницы: главная, раздел инфоблока, элемент инфоблока. После первой загрузки любой из этих страниц иконка плагина Bitrix Composite Notifier черно-белая, а после второй уже цветная — это значит, что композит работает.

Плагин Bitrix Composite Notifier довольно глючный. У меня он почти всегда зеленый, даже на страницах yandex.ru и google.com. Так что надо кликнуть по иконке плагина, и если в окошке вместо информации по композиту

Page
X-Bitrix-Composite:  Cache (200)
HTTP Status:         HTTP/1.1 200 OK
Server Response:     9ms
DomContentLoaded:    359ms
Ajax Request
X-Bitrix-Composite:  Ajax (stable)

служебная информация о самом плагине, значит композит не работает.

В панели управления, на странице «Настройки • Настройки продукта • Композитный сайт • Страницы», можно посмотреть список закешированных страниц:

Эти данные хранятся в таблице базы данных b_composite_page:

ID  CACHE_KEY                                       HOST           URI                    TITLE                       CREATED              CHANGED              LAST_VIEWED          VIEWS  REWRITES  SIZE
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
6   /www.host11.ru/test/index@.html                 www.host11.ru  /test/                 Статьи о домашних животных  2018-11-25 09:40:55  2018-11-25 10:35:43  2018-11-25 10:36:31  3      1         18810
7   /www.host11.ru/test/category/id/16/index@.html  www.host11.ru  /test/category/id/16/  Породы кошек                2018-11-25 09:43:20  2018-11-25 10:44:10  2018-11-25 10:44:10  14     2         16572
8   /www.host11.ru/test/item/id/322/index@.html     www.host11.ru  /test/item/id/322/     Абиссинская кошка           2018-11-25 09:44:31  2018-11-25 10:31:04  2018-11-25 10:31:04  2      1         14468

А сами файлы кеша — в директории /bitrix/html_pages/, для каждого домена — отдельная поддиректория типа www.domain.ru.

Отладка композита

В панели управления переходим на страницу «Настройки • Настройки продукта • Композитный сайт • Отладка» и нажимам кнопку «Включить отладку». После этого в браузере Chrome просматриваем несколько страниц сайта. Возвращаемся в панель управления и видим, что страницы кеша перезаписываются:

Смотрим, из-за чего это происходит:

Я не учел того, что простые компоненты, входящие в состав комплексного, подсчитывают количество просмотров элементов инфоблока и выводят ее на всех страницах. Количество просмотров — динамическая информация, она меняется постоянно.

Т.е. на самом деле, шаблоны простых компонентов не статичные, они статичные с динамичными зонами. Динамичная зона — число просмотров элемента. Нужно изменить все три шаблона простых компонентов, входящих в состав комплексного:

<?php
/*
 * Файл local/components/tokmakov/iblock/templates/.default/tokmakov/iblock.element/.default/template.php
 */
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true) die();
?>

<h1><?= $arResult['NAME']; ?> [Комплексный]</h1>
<article id="iblock-element">
    <?php if (!empty($arResult['DETAIL_PICTURE'])): ?>
        <img src="<?= $arResult['DETAIL_PICTURE']['SRC']; ?>"
             alt="<?= $arResult['DETAIL_PICTURE']['ALT']; ?>"
             title="<?= $arResult['DETAIL_PICTURE']['TITLE']; ?>" />
    <?php endif; ?>
    <p>
    <?php
    // создаем динамическую зону в статическом шаблоне
    $frame = $this->createFrame()->begin('Количество просмотров: Загрузка...');
    ?>
    Количество просмотров: <?= $arResult['SHOW_COUNTER'] ? $arResult['SHOW_COUNTER'] : 0; ?>
    <?php $frame->end(); ?>
    </p>
    <?php if (!empty($arResult['DETAIL_TEXT'])): ?>
        <div>
        <?= $arResult['DETAIL_TEXT'] ?>
        </div>
    <?php endif; ?>
    <p><a href="<?= $arResult['SECTION']['SECTION_PAGE_URL']; ?>">Назад в раздел</a></p>
</article>

Можно часто встретить информацию, что для отладки композита нужно определить две константы в файле dbconn.php:

define('BX_COMPOSITE_DEBUG', true);
define('LOG_FILENAME', $_SERVER['DOCUMENT_ROOT'].'/log.txt');

Так вот, это не работает, начиная с версии Битрикс 17.1.0:

  • все классы технологии теперь находятся в пространстве имен \Bitrix\Main\Composite\
  • в административном разделе добавлены новые страницы мониторинга и отладки
  • логирование всех ошибок, при которых режим кеширования может не сработать
  • отказ от константы BX_COMPOSITE_DEBUG
  • визуальное сравнение версий для поиска причин перезаписи кеша

Логи для отладки композита сохраняются в таблице базы данных b_composite_log:

ID  HOST           URI                    TITLE                       CREATED              TYPE             MESSAGE                         AJAX  USER_ID  PAGE_ID
------------------------------------------------------------------------------------------------------------------------------------------------------------------
4   www.host11.ru  /test/category/id/19/  Породы собак                2018-11-28 09:41:17  CACHE_REWRITING  <!DOCTYPE html><html xmlns=...  Y     0        32
5   www.host11.ru  /test/                 Статьи о домашних животных  2018-11-28 09:41:22  CACHE_REWRITING  <!DOCTYPE html><html xmlns=...  Y     0        31

Когда страница отдается из кеша, добавляется заголовок X-Bitrix-Composite со следующими значениями:

  • X-Bitrix-Composite: Cache (200) — отдача страницы из композитного кеша с кодом 200
  • X-Bitrix-Composite: Cache (304) — отдача страницы из композитного кеша с кодом 304

Этот же заголовок добавляется в ответ сервера на ajax-запрос:

  • X-Bitrix-Composite: Ajax (stable) — кеш не изменился на этом хите
  • X-Bitrix-Composite: Ajax (changed) — кеш изменился на этом хите

Страница из кеша отправляется с заголовком Last-Modified, который сообщает дату последнего изменения страницы — это дата создания файла на диске. Когда браузер получает ответ с таким заголовком, то последующие свои запросы этой страницы он делает с заголовком If-Modified-Since — изменилась страница после даты Last-Modified? И если страница не изменилась, то сервер вместо страницы отдает код 304 Not Modified, а браузер берет страницу из локального кеша.

Код 304 сервер отдает на третий хит: на первом создаётся композитный кеш, на втором передаётся время изменения, а третий запрос страницы идет с заголовком If-Modified-Since, на который сервер отвечает 304 Not Modified.

Поиск: AJAX • CMS • Web-разработка • Битрикс • Кеширование • Композитный сайт • Настройка

Каталог оборудования
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.