Зачем это нужно?
Для достижения максимальной гибкости без потери производительности. Кэширование выгодно только тогда, когда данные редко изменяются. Но что делать, если в целом содержимое компонента хорошо кэшируется, но в нем присутствует область, где выводятся некие персональные для каждого пользователя данные либо просто часто изменяющиеся данные? Например, нам хотелось бы взять стандартный компонент новостей и вставить в середину списка динамически генерируемый рекламный блок. В таких ситуациях помогут некэшируемые области.
Как это сделать?
Следующий код нужно подключить в вашем файле /bitrix/php_interface/init.php:
Использование некэшируемых областей в шаблоне компонента проиллюстрируем примером.
template.php:
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?> <?nciStart();?> <?=ConvertTimeStamp(false, "FULL")?> - компонент закэширован<br /> <[#INSERT#]> - текущее время<br /> <?nciFinish($component)?> |
component_epilog.php:
<?if (!defined ("B_PROLOG_INCLUDED") || true !== B_PROLOG_INCLUDED) die();?> <?=nciDisplay($component)?> |
insert.php:
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?> <?=ConvertTimeStamp(false, "FULL")?> |
Обработка некэшируемых областей будет проводиться только в тех шаблонах компонентов, где вы укажете данный код, все остальные компоненты будут работать, как раньше.
Если вы пользуетесь каким-нибудь пользовательским движком шаблонизации, то весь служебный код можно вынести туда. Если кому-то интересно, могу предоставить код для Smarty.
Как это работает?
Некэшируемый файл component_epilog.php, появившийся в девятке, не имеет доступа к закэшированному HTML-коду шаблона. Поэтому в файле template.php вывод буферизуется и помещается в переменную $arResult["RESULT_HTML"], после чего данная переменная помечается как кэшируемая с помощью метода CBitrixComponent::SetResultCacheKeys. В component_epilog.php содержимое данной переменной просто выводится, предварительно заменяя некэшируемые вставки на результат выполнения соответствующего php-файла в папке шаблона (по методу Виталия Оборина).
Преимущества метода
Подобную задачу можно решать различными способами, каждый из которых обладает своими положительными и отрицательными сторонами. Основные преимущества продемонстрированного подхода: простота, легкость использования и главное - он действительно работает =)
Домашнее задание
Для достижения простоты и наглядности я не стал реализовывать некоторые фичи. Что можно усовершенствовать:
- добавить возможность использования в некэшируемых областях массивов $arParams и $arResult
- посыпать некэшируемые вставки солью, чтобы исключить даже малейшую вероятность ложного срабатывания
- произвести интеграцию с движками шаблонизации
Disclaimer
Автор не несет ответственности за непреднамеренное порабощение Вселенной, которое может произойти при выполнении вышеуказанного кода =)
Приветствуются конструктивная критика, пожелания и готовые примеры доработки.