260 likes | 601 Views
Композитный сайт. Юрий Тушинский « Битрикс », технический директор. Основная идея. Максимально быстро отдать пользователю страницу из кеша Д ополнительным ajax - запросом проверить валидность кеша и получить данные динамических областей. До. После. Ajax- запрос. Динамический контент.
E N D
Композитный сайт Юрий Тушинский «Битрикс», технический директор
Основная идея • Максимально быстро отдать пользователю страницу из кеша • Дополнительным 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() – контент динамической области является заглушкой (запишется в кеш).
Динамический контентвне компонента • Динамическая область может находится и вне контекста компонентов (шаблон сайта, 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_pages.php10Удалит все файлы, которые были созданы раньше, чем 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
Спасибо за внимание! Вопросы?