Upload
ginger
View
88
Download
7
Embed Size (px)
DESCRIPTION
Композитный сайт. Юрий Тушинский « Битрикс », технический директор. Основная идея. Максимально быстро отдать пользователю страницу из кеша Д ополнительным ajax - запросом проверить валидность кеша и получить данные динамических областей. До. После. Ajax- запрос. Динамический контент. - PowerPoint PPT Presentation
Citation preview
Композитный сайт
Юрий Тушинский«Битрикс», технический директор
Основная идея
• Максимально быстро отдать пользователю страницу из кеша• Дополнительным 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-страницы)
$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 Timing
Где лежит кеш и как его удалять
• Настройки продукта -> Автокеширование Вкладка Очистка файлов кеша
• php -f /path/to/site/bitrix/modules/main/tools/cron_html_pages.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
Спасибо за внимание! Вопросы?