В данной статье я не буду описывать всю технологию, ибо документация по ней присутствует, а отмечу только те моменты, с которыми, по моему мнению, могут возникнуть трудности или непонимание на начальном этапе.
Голосование компонентов
Наверно вы уже видели в шаблонах разных компонентов такую строку:
$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С-Битрикс», которая появится внизу страницы, если соответствующая ссылка разрешена в настройках композитного кеша (позицией данной кнопки на странице также можно управлять с помощью специального div-контейнера).
- С помощью расширения «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();