Тонкости композитного режима в 1C-Bitrix

Тонкости композитного режима в 1C-Bitrix

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

Голосование компонентов

Наверно вы уже видели в шаблонах разных компонентов такую строку:

$this->setFrameMode(true);

Так вот, данная функция ничего не включает и не отключает, она только «ГОЛОСУЕТ» за или против использования композитного кеширования на странице, где находится компонент. Это значит, что если в зависимости от настройки композитного режима в админке, а именно опции «Голосование шаблона компонента по умолчанию» (может быть «За» или «Против») и учета голосов всех компонентов на странице, композитный режим кеширования на данной странице будет включен или выключен. При этом, если в админке по умолчанию установлено «Против», то чтобы композитный режим был включен, за него явно должны проголосовать все компоненты.

Динамические области внутри шаблонов компонентов

Динамические области, т.е. те фрагменты html-кода, которые будут подгружены Ajaxом после загрузки закешированной страницы, выделяются в шаблоне компонента при помощи $this->createFrame()->begin(). При этом, есть несколько вариантов их использования, в зависимости от указания параметров как у createFrame, так и у begin.

В первом параметре createFrame указывается DOM идентификатор контейнера, в который будет подгружена динамическая область область после загрузки закешированной странице. При этом во втором параметре следует указать false.

<li id="my_container">
   <?$frame = $this->createFrame("my_container", false)->begin();?>
      <?if($USER->IsAuthorized()):?>
         <a href="<?=$arResult["USER"]["PROFILE_URL"]?>"><?=$arResult["USER"]["NAME"]?></a>
      <?else:?>
         <a href="<?=$arResult["AUTH_URL"]?>">Войти</a>
      <?endif?>
   <?$frame->beginStub()?>
      Загрузка...
   <?$frame->end();?>
</li>

При этом после  $frame->beginStub() указывается html-код «заглушки», т.е. тот html, который будет показан до того, как будет подгружена динамическая область. $frame->beginStub() указывать необязательно, можно указать html код заглушки в первом параметре функции begin (а если заглушка не нужна, то в этом параметре при отсутствии $frame->beginStub() следует указывать пустую строку):

<li id="my_container2">
    <?$frame = $this->createFrame("my_container2", false)->begin("Загрузка...");?>
        <?if($USER->IsAuthorized()):?>
            <a href="<?=$arResult["USER"]["PROFILE_URL"]?>"><?=$arResult["USER"]["NAME"]?></a>
        <?else:?>
            <a href="<?=$arResult["AUTH_URL"]?>">Войти</a>
        <?endif?>
    <?$frame->end();?>
</li>

Отмена композитного кеширования

Отменить композитное кеширование в любом месте страницы можно с помощью следующей инструкции:

\Bitrix\Main\Data\StaticHtmlCache::getInstance()->markNonCacheable();

Тестирование

О том что композитный кеш на странице работает (точнее, что страница загружена из композитного кеша) можно судить одним из двух способов:

  1. По наличию ссылки «Быстро с 1С-Битрикс», которая появится внизу страницы, если соответствующая ссылка разрешена в настройках композитного кеша (позицией данной кнопки на странице также можно управлять с помощью специального div-контейнера).
  2. С помощью расширения «Bitrix Composite Notifier» для браузера «Google Chrome». Если страница идет из композитного кеша, иконка расширения становится цветной вместо серой, и при нажатии на иконку будет отображаться дополнительная информация.

Имейте в виду, что для того, чтобы страница начала отображаться из кеша, как правило нужно перезагрузить страницу 2 раза после первого ее открытия.

Для отладки можно включить лог композитного кеша. Если, например, какой-то компонент голосует против композитного кеша, записи в логе помогут определить какой и т.д. Включить лог можно так:

define("BX_COMPOSITE_DEBUG", true);
define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"]."/log.txt");

Сброс кеша при помощи api

Сброс композитного кеша вручную производится на той же странице админки «Настройки кеширования», на которой производится сброс орбычного (не коспозитного кеша). А вот у удалениея кеша при помощи api существуют некоторые особенности.

Если необходимо удалять кеш по расписанию, то не рекомендуется просто удалять содержимое папки /bitrix/html_pages/домен/. Хотя можно поступить и так, удалив при этом также содержимое файла /bitrix/html_pages/.enabled, но в этом нет необходимости, т.к. в системе уже существует специально созданный файл /bitrix/modules/main/tools/cron_html_pages.php, запуск которого можно осуществлять из под крона. Например, следующая команда запустит удаление файлов композитного кеша, которые были созданы ранее чем 10 часов назад:

php -f  /path/to/site/bitrix/modules/main/tools/cron_html_pages.php 10

Также можно удалить композитный кеш при помощи api:

$staticHtmlCache = \Bitrix\Main\Data\StaticHtmlCache::getInstance();
$staticHtmlCache->deleteAll();