Композитный сайт Юрий Тушинский «Битрикс», технический директор
Основная идея Максимально быстро отдать пользователю страницу из кеша Дополнительным ajax-запросом проверить валидность кеша и получить данные динамических областей. До После Ajax-запрос
Динамический контент Сайт логически делится на статические и динамические области. Статическая область сохраняется на диск и отдается сразу и целиком. Динамические области: отличаются для разных пользователей часто меняются (секунды или минуты) не могут быть вложенными Контент динамических областей возвращается в ajax-запросе. Список новостей – это не динамическая часть!
Как работает
Включение и настройки Хранение кеша Файлы (папка /bitrix/html_pages/) Memcached Отдача кеша PHP (по умолчанию) Nginx (требуется дополнительная настройка)
Включение и настройки
Условие включения режима Только GET-запросы Это не HTTPS Это не IE6-9 (main ) Запрос не начинается с /bitrix Это не ajax-запрос, сделанный с помощью BX.ajax Нет cookie _NCC Запрос не входит ни в одну из масок исключения Запрос входит хотя бы в одну маску включения Проверка параметров в query_string согласно настройкам
Голосование «за» и «против» Компоненты и шаблоны, подключенные на странице, голосуют за композитный режим По умолчанию компоненты голосуют «за», а шаблоны – «против» Если хоть один из них проголосовал против, то для страницы режим включен не будет В этом случае в журнал отладки AddMessage2Log делается запись (если включена константа BX_COMPOSITE_DEBUG)
Отладка dbconn.php: define("BX_COMPOSITE_DEBUG", true); define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"]."/log.txt"); В папке кеша /bitrix/html_pages/ / файлы перед перезаписью копируются в *.delete. Вызывается функция AddMessage2Log когда компонент или шаблон голосуют против когда создается файл *.delete когда превышена дисковая квота
Отладка
Шаблон до интеграции
Шаблон голосует «за»
Выделение динамической области
->begin('') – пустая строка означает пустую заглушку ->begin('Загрузка…') ->begin() – контент динамической области является заглушкой (запишется в кеш).
Свой контейнер и инициализация JS
Динамический контент вне компонента Динамическая область может находится и вне контекста компонентов (шаблон сайта, php-страницы) $frame = new \Bitrix\Main\Page\FrameHelper("my_dynamic_area"); $frame->begin(); //динамический контент $frame->beginStub(); //заглушка $frame->end(); \Bitrix\Main\Page\Frame::getInstance()->startDynamicWithID("area"); // некоторый динамический контент вне компонента \Bitrix\Main\Page\Frame::getInstance()->finishDynamicWithID("area", stub"); Способ с буферизацией. Удобнее, но нельзя использовать отложенные функции.
Алгоритм интеграции Проверить отсутствие в логах голосов «против» Обновить страницу и проверить отсутствие лога с информацией об удалении файла из кеша Если такие файлы есть, то сравнить их и устранить причину различий
Что приводит к перезаписи кеша Случайные строки (ID сессии, id для JS-объектов и др.) Метод компонента randString() обеспечивает стабильную генерацию псевдо-случайных величин Сколько раз его ни вызывай в шаблоне – это не повлияет на другие компоненты/шаблоны Для разных пользователей выводится разный контент Если на странице подставляется REQUEST_URI (в form[action], back_url и. т. п.), т.к. site.ru/folder/ и site.ru/folder/index.php – это один файл кеша. Если контент меняется на каждом хите (баннеры, текущее время)
Работа с локальной БД браузера
Осторожно используем BX.message В закешированной странице нет следующих JS-данных: BX.message("USER_ID") BX.message("bitrix_sessid") или BX.bitrix_sessid() BX.message("SERVER_TIME") BX.message("SERVER_TZ_OFFSET") BX.message("USER_TZ_OFFSET") BX.message(USER_TZ_AUTO") Приходят с ajax-запросом и кэшируются в localStorage Если происходит обращение к этим данным и их нет в localStorage, происходит блокирующий ajax-запрос
304-ответ Для статического кеша отдается HTTP-заголовок Last-Modified Браузер делает Conditional Get-запрос с заголовком If-Modified-Since Для связки NGINX+Memcached заголовок будет 200
Считаем миллисекунды Композитный режим влияет только на время ожидания ответа от сервера (Server Response Time) Не влияет на время: DNS lookup, TCP соединения Загрузки JS, CSS и картинок Учет композитных страниц в Google Analytics Google Analytics и Яндекс.Метрика собирают данные клиентской загрузки на основе Navigation TimingNavigation Timing
Где лежит кеш и как его удалять Настройки продукта -> Автокеширование Вкладка Очистка файлов кеша php -f /path/to/site/bitrix/modules/main/tools/cron_html_pa ges.php 10 Удалит все файлы, которые были созданы раньше, чем 10 часов назад Если изменился шаблон сайта, имеет смысл удалить весь кеш.
Планы развития Удобный инструмент для отладки Уход от констант и текстовых логов Логирование причин, из-за которых не сработал композитный режим Визуальное сравнение версий страниц Упрощение настройки nginx Автоконфигуратор правил на основе настроек в админке Персонализированный кеш
Где почитать? Учебный курс: Документация на сайте: Посты в блоге Антона Герасимюка:
Спасибо за внимание! Вопросы?