Композитный сайт Юрий Тушинский «Битрикс», технический директор Основная идея • • Максимально быстро отдать пользователю страницу из кеша Дополнительным ajax-запросом проверить валидность кеша и получить данные динамических областей. До После Ajax-запрос Динамический контент • Сайт логически делится на статические и динамические области. • Статическая область сохраняется на диск и отдается сразу и целиком. • Динамические области: • отличаются для разных пользователей • часто меняются (секунды или минуты) • не могут быть вложенными • Контент динамических областей возвращается в ajax-запросе. • Список новостей – это не динамическая часть! Как работает Включение и настройки • Хранение кеша • Файлы (папка /bitrix/html_pages/) • Memcached • Отдача кеша • PHP (по умолчанию) • Nginx (требуется дополнительная настройка) Включение и настройки Условие включения режима • • • • • • • • • Только GET-запросы Это не HTTPS Это не IE6-9 (main 14.5.2) Запрос не начинается с /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/<domain>/ файлы перед перезаписью копируются в *.delete.<microtime> • Вызывается функция AddMessage2Log • когда компонент или шаблон голосуют против • когда создается файл *.delete • когда превышена дисковая квота Отладка Шаблон до интеграции Шаблон голосует «за» Выделение динамической области Выделение динамической области • ->begin('') – пустая строка означает пустую заглушку • ->begin('Загрузка…') • ->begin() – контент динамической области является заглушкой (запишется в кеш). Свой контейнер и инициализация JS Динамический контент вне компонента • Динамическая область может находится и вне контекста компонентов (шаблон сайта, php-страницы) \Bitrix\Main\Page\Frame::getInstance()->startDynamicWithID("area"); // некоторый динамический контент вне компонента \Bitrix\Main\Page\Frame::getInstance()->finishDynamicWithID("area", ”stub"); Способ с буферизацией. Удобнее, но нельзя использовать отложенные функции. $frame = new \Bitrix\Main\Page\FrameHelper("my_dynamic_area"); $frame->begin(); //динамический контент $frame->beginStub(); //заглушка $frame->end(); Алгоритм интеграции • Проверить отсутствие в логах голосов «против» • Обновить страницу и проверить отсутствие лога с информацией об удалении файла из кеша • Если такие файлы есть, то сравнить их и устранить причину различий Что приводит к перезаписи кеша • Случайные строки (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 Timing Где лежит кеш и как его удалять • Настройки продукта -> Автокеширование Вкладка Очистка файлов кеша • php -f /path/to/site/bitrix/modules/main/tools/cron_html_pa ges.php 10 Удалит все файлы, которые были созданы раньше, чем 10 часов назад • Если изменился шаблон сайта, имеет смысл удалить весь кеш. Планы развития • Удобный инструмент для отладки • • • Уход от констант и текстовых логов Логирование причин, из-за которых не сработал композитный режим Визуальное сравнение версий страниц • Упрощение настройки nginx • Автоконфигуратор правил на основе настроек в админке • Персонализированный кеш Где почитать? • • • Учебный курс: https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=39 Документация на сайте: http://dev.1c-bitrix.ru/user_help/settings/settings/composite.php Посты в блоге Антона Герасимюка: http://dev.1c-bitrix.ru/community/blogs/cookbook/composite-website-tips-tricks.php http://dev.1c-bitrix.ru/community/blogs/cookbook/composite-news.php Спасибо за внимание! Вопросы?