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

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

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

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

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

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

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

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

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

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

<?$frame->beginStub();?>
    <?if ($arResult['QUANTITY'] > 0):?>
        всего <?=$arResult['QUANTITY'];?> товара
    <?else:?>
        у Вас нет покупок, начните их делать прямо сейчас
    <?endif;?>
<?$frame->end();?>

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

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

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