Чистка кеша компонента Битрикс по событию

Представим такую ситуацию: компонент календарь (к примеру) стоит в нескольких местах с разными шаблонами (возьмем 2 шаблона). В шаблоне компонента должен выводиться выпадающий список, который бы содержал всех пользователей. Пользователей мы получим с помощью api битрикс в файле result_modifier.php шаблона компонента календарь. Но в будущем пользователей будет не мало, поэтому стоит закешировать список select с пользователями, чтобы при каждом обращении к странице с компонентом календарь не делать дорогостоящих запросов к базе данных.

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

Кеш компонентов битрикс хранится в папке /bitrix/cache/s1/bitrix/components.
Где s1 — идентификатор сайта, bitrix (во втором случае) — пространство имен. Для стандартных компонентов это bitrix, для скопированных — свое имя папки. Далее идет название компонента, в нашем случае news.calendar, и в нем папки со случайным названием — там содержится кеш шаблонов. Каждая папка для отдельного шаблона.

путь к папке кеша битрикс

Нам нужно повесить удаление кеша компонента news.calendar на события

  • OnAfterUserAdd — добавление пользователя
  • OnAfterUserUpdate — обновление данных пользователя
  • OnUserDelete — удаление пользователя

Для этого в файле /bitrix/php_interface/init.php нужно добавить код

function clearCalendarCache() {
 BXClearCache(true, "/s1/bitrix/news.calendar/");
}
AddEventHandler("main", "OnAfterUserAdd", 'clearCalendarCache');
AddEventHandler("main", "OnAfterUserUpdate", 'clearCalendarCache');
AddEventHandler("main", "OnUserDelete", 'clearCalendarCache');

BXClearCache — функция, которая удаляет кеш. Первый параметр — удалять ли кеш полностью (true или false). Второй — путь к папке с кешем относительно /bitrix/cache.

Статья оказалась полезной? Вырази благодарность - поделись в соцсетях

Комментирование отключено