Битрикс. Композитный сайт. Часть 1 из 3
17.11.2018
Теги: AJAX • CMS • Web-разработка • Битрикс • Кеширование • КомпозитныйСайт • Настройка
Как это работает
Многие элементы страниц сайта выглядят одинаково, например, шапка и подвал. У композитного сайта данные, одинаковые для всех пользователей (статические) хранятся в виде html-файла на сервере (кеш). И могут быть отданы сразу, без выполнения php-кода и запросов к базе данных. Данные, которые у пользователей различаются (корзина, личный кабинет) подгружаются в фоновом режиме, когда HTML уже отобразился в браузере. Эти данные называются динамическими. Параллельно с ними загружаются CSS, Javascript, шрифты, изображения.
При фоновом ajax-запросе Битрикс формирует страницу полностью. Из полученного html-кода вырезаются динамические данные и отправляются браузеру в формате json. Браузер вставляет полученные от сервера актуальные данные вместо специальных заглушек. А на сервере тем временем происходит обратный процесс — на место вырезанных динамических данных вставляются заглушки. После замены всей динамики на статику, считается контрольная сумма получившейся страницы. Если эта сумма не совпадает с контрольной суммой страницы в кеше — кеш перезаписывается.
Страницу из кеша сервер отправляет браузеру с заголовком 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)
— отдача страницы из композитного кеша с кодом 200X-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
, а браузер берет страницу из локального кеша.
If-Modified-Since
, на который сервер отвечает 304 Not Modified
.
Поиск: AJAX • CMS • Web-разработка • Битрикс • Кеширование • Композитный сайт • Настройка