Продолжаем про кеш. Композитный сайт Битрикс

Продолжая тему оптимизации скорости загрузки сайта, хочу рассказать о новой технологии от Битрикс — композитный сайт. Как водится, все новое — это хорошо забытое старое, вот и эта технология в общем-то мало отличается от кеширования страниц целиком в том же phpbb или wordpress, разве что с рядом технических улучшений. Но, обо всем — по порядку.

В первую очередь, если вы вдруг решили интегрировать сайт с данной технологией, то будьте готовы к неприятностям, в том числе и с юридической точки зрения. После успешной интеграции на страницах, которые будут работать в композитном режиме, появится изображение-ссылка следующего вида composite, которая будет вести на лендинг битрикса с инфой о композитном сайте. Оно бы ничего, но для среднего размера сайтов может стать проблемой, т.к. владельцы сайтов обычно не любят размещать рекламу на сторонние ресурсы без их ведома. В принципе — есть возможность настроить внешний вид этой кнопки через админку (поменять цвет самой кнопки, текста), можно даже задать расположение и стили, если пометить нужный блок как #bx-composite-banner.  Технически — ничего не помешает и убрать эту ссылку, обернуть в noindex и скрыть стилями или же с помощью js, но вот каковы будут последствия данного действия — увы неизвестно, ведь у битрикса есть возможность мониторинга за сайтами (а как вы думаете они загружают статистику по скорости загрузки?) и технически добавить туда код, который будет отслеживать наличие кнопки, труда не составит (если его уже там нет).
А можно  еще и вполне легально отключить показ данной кнопки, да. На момент написания этих строк данная возможность стоит 300 тыр!, что нереально дорого на мой взгляд.

Едем дальше. Композитный режим работы сайта в битрикс — это логичное продолжение технологии html кеширования. Суть данного механизма в том, чтобы сгенерировать и сохранить куда-нибудь полный html код сайта и потом на следующих хитах раздавать уже заранее сгенерированный контент. Скорость отдачи контента сервером в этом случае крайне мала — начинает от неприличных 0.001 сек. Динамические сайты при этом сталкиваются с проблемой обновления кеша, ведь в интернет-магазинах, например, существуют блоки, содержимое которых зависит от различных действий пользователя. Например, достаточно положить товар в корзину и кеш уже нужно обновлять, что неприемлемо. Для решения данной проблемы битриксоиды придумали такую фишку, что после загрузки страницы битрикс совершает дополнительный хит по тому же адресу, но без кеша, и выдирает оттуда актуальные данные, мгновенно подставляя их на неактуальные блоки. Кеш разбивается на статические и динамические блоки. Динамические блоки, в свою очередь, делятся на полностью динамические и частично динамические.

Мы знаем, что строительной единицей сайтов на битриксе являются компоненты. Каждый компонент — отдельный блок. Для запуска композитного режима работы на определенной странице потребуется сначала все компоненты обучить работе с композитным режимом. Точнее даже не так — все компоненты уже обучены работать в композите (за исключением нескольких специфических -Универсальные списки (bitrix:lists), Подписка (bitrix:sale.personal.subscribe), Поиск (bitrix:search.page)). А вот шаблоны этих компонентов вам придется обучить самостоятельно.

Как я уже говорил выше, вам нужно определить, какие из компонентов будут являться полностью статическими (не изменяющимися в течение времени или от действий пользователя), динамическими (часто изменяющимися) и частично динамическими.
В качестве примера статических компонентов могут выступать блоки со списком новостей (выводимых в хронологическом порядке), детальные страницы материалов (новостей, статей, товаров), включаемые области — в общем все то, что меняется относительно редко.
Полностью динамическим компонентом может выступать тот, который бесполезно складывать в кеш (который целиком будет обновлен на следующем хите). Типичными представителями являются компоненты с рандомным набором товаров, статей.
Примером частично динамического компонента может служить тот, который зависит от действий пользователя. Например — корзина на сайте, или состояние внутреннего счета пользователя, блок с выбором региона и т.д.

Теперь о том, как же технически научить компоненты работать с композитом.
В случае со статическими компонентами — достаточно добавить в верхнюю часть шаблона вызов метода $this->setFrameMode(true);. Этим вызовом мы сообщаем шаблону, что он всегда будет «голосовать» за композит (здесь и дальше я буду употреблять термин «голосования», чтобы сильно не отходить от терминологии битрикса).

С динамическими компонентами все несколько сложнее. Разберем сначала «частично динамические» на примере корзины пользователя. Например, в нашей корзине показывается количество товаров в ней лежащих. Разумно предположить, что динамической областью в данном компоненте будет количество товаров:

basket-before     basket-after

На данном примере видно, что в зависимости от количества товаров в корзине меняется надпись, соответственно ее нужно выделить в динамический блок, а остальное пометить как кешируемый контент. Сказано — сделано! Для того, чтобы пометить шаблон компонента динамическим, нужно в его начале вызвать метод $this->createFrame()->begin();. Данный метод возвращает инстанс класса, который управляет кешированием в шаблонах компонентов. Вызовем его примерно так:

$obFrame = $this->createFrame()->begin(‘Загрузка’);
После этого в верстке шаблона в нужном месте необходимо выделить условие, в зависимости от которого показывается данный текст(код упрощен, не забудьте вынести тексты в языковые константы):

Важно понимать, что все, что находится между beginStub и end будет выполнено на каждом хите, но в кеш в этом месте запишется то, что вы передали в качестве параметра методу begin(). Т.е. в кеш запишется дефолтный текст, а после отдачи страницы из кеша будет запрошен актуальный контент, который практически мгновенно будет вставлен поверх «заглушки», в качестве которой мы использовали в примере строку «Загрузка». К слову — вместо заглушки может быть все что угодно, ведь это строка, а значит можно вставить какой-то кусок верстки с гифкой, имитирующей подгрузку блока.
Таких пар beginStub() и end() может быть сколь угодно много в шаблоне компонента, но главное условие при этом — чтобы они не были вложены друг в друга.
Если передавать в метод begin() параметр, то он будет трактоваться как строка и содержимое этой строки попадет в кеш в качестве заглушки. Если в этот метод не передавать никаких параметров, то в кеш будет записан тот контент, который был сгенерирован на предыдущем хите, но в нашем примере с корзиной это неприменимо, т.к. контент может поменяться в любой момент по воле пользователя.

Теперь, я думаю вы догадались, для того, чтобы сделать компонент целиком динамическим, то достаточно вызвать $this->createFrame()->begin(‘Загрузка’); в начале шаблона и все, все содержимое компонента будет являться динамическим, а кеш запишется то содержимое, которое будет указано в параметре к методу begin()

На этот раз достаточно, в следующей статье разберем подводные камни, на которые придется наткнуться при подключении композитного сайта.

 

 

 

  • Рональд

    Добрый день Михаил. Восхищаюсь вашими знаниями и способностью внятно донести до простых смертных суть происходящего !!!!! Прошу помочь в разработке интернет магазина. Не бесплатно Михаил)))))) связаться со мной можно stroi001@mail.ru !!!!