Давно не писали про Битрикс, а тут столкнулись с проблемой - регулярно растет кеш сайта до невероятных размеров и приводит к заполнению диска на сервере. При этом сайт перестает нормально работать, и что бы реанимировать его требуется подключение по SSH и ручная чистка каталога с кешем.
И вот, озадачившись автоматизацией работы, решил убрать ручной труд из еженедельного рациона. Идея такая - создать агента, который по расписанию будет выполнять очистку устаревшего кеша.
Начнем с написания скрипта. В папке /bitrix/php_interface/ создаем файл, если его нет, init.php и добавляем в него нашу функцию:
<?
function clean_expire_cache($path = "") {
// Проверка и подключение класса CFileCacheCleaner
if (!class_exists("CFileCacheCleaner")) {
require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/classes/general/cache_files_cleaner.php");
}
$currentTime = time();
$endTime = (defined("BX_CRONTAB") && BX_CRONTAB === true) ? $currentTime + 5 : $currentTime + 1;
// Инициализация очистителя кэша
$obCacheCleaner = new CFileCacheCleaner("all");
if (!$obCacheCleaner->InitPath($path)) {
// Произошла ошибка
return "clean_expire_cache();";
}
$obCacheCleaner->Start();
// Очистка устаревших файлов кэша
while ($file = $obCacheCleaner->GetNextFile()) {
if (is_string($file)) {
$date_expire = $obCacheCleaner->GetFileExpiration($file);
if ($date_expire && $date_expire < $currentTime) {
unlink($file);
}
if (time() >= $endTime) break;
}
}
// Возвращение следующего вызова функции
return is_string($file) ? "clean_expire_cache(\"" . $file . "\");" : "clean_expire_cache();";
}
?>
В целом, по комментариям должно быть понятно, что делает скрипт. Но если коротко - фиксируется текущее время, запускается удаление кеша со временем устаревания больше, чем текущее, если выполнение затягивается - процесс останавливается до следующего запуска.
Сохранив изменения в файле, переходим в Администрирование - Настройки - Настройки продукта - Агенты (/bitrix/admin/agent_list.php) и создаем агента:

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

Сохраняем и мониторим, как кеш стабилизируется.
Надеюсь было полезно. Будем благодарны за Комментарии и шаринг.
