07 PPTX, 2 МБ

реклама
Композитный сайт
Юрий Тушинский
«Битрикс», технический директор
Основная идея
•
•
Максимально быстро отдать пользователю страницу из кеша
Дополнительным 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
Спасибо за внимание!
Вопросы?
Скачать