Настройка автокеширования на 1С-Битрикс


Рассказываем и показываем, как настроить автоматическое удаление кеша на 1С-Битрикс.

Перейдите на панели администрирования в Настройки (1) → Настройки продукта (2) → Автокеширование (3). Откройте вкладку «Очистка файлов кеша» и выберите (4):

  • Только устаревшие.
  • Все.
  • Меню – в случае, если проводите проверки доступа к его пунктам.
  • Весь управляемый – файлы раздела /bitrix/managed_cache/.
  • Все страницы HTML кеша.

Папка /bitrix/cache/ растет

В папке /bitrix/cache/ находятся файлы неуправляемого кэша. Она может увеличиваться в объеме, если при создании файлов устанавливаются права без возможности их последующего изменения и удаления.

При назначении прав на файлы и папки используются значения констант BX_FILE_PERMISSIONS и BX_DIR_PERMISSIONS из /bitrix/php_interface/dbconn.php. но часто срабатывает маска прав на сервере и чтобы избежать этого необходимо прописать в этом же скрипте:

umask(000);
@umask(~BX_DIR_PERMISSIONS);

Не удаляется устаревший кэш

Для удаления устаревшего кэша нужно добавить нового агента. Перейдите в Настройки (1) → Настройки продукта (2) → Агенты (3) и выберите «Добавить агента» (4).


В открывшейся вкладке задайте настройки для агента (1-3):

  • Функция агента – clean_expire_cache();
  • Сортировка – 100.
  • Интервал – 10.

Сохраните нового агента.


Далее перейдите в /bitrix/php_interface/. Найдите файл init.php.

В файл вставьте:

if (defined("BX_CRONTAB") && BX_CRONTAB === true)
   $endTime = time()+5; //Если на кроне, то работает 5 секунд 
else
   $endTime = time()+1; //Если на хитах, то не более 1 секунды

Время работы скрипта зависит от того, исполняется он на Cron или нет. Если скрипт исполняется не на Cron, то время исполнения назначается в 1 секунду.

Если файла init.php нет, то создайте его и вставьте:

<?
function clean_expire_cache($path = "") {
    if (!class_exists("CFileCacheCleaner")) {
        require_once ($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/classes/general/cache_files_cleaner.php");
    }
    $curentTime = mktime();
if (defined("BX_CRONTAB") && BX_CRONTAB === true) $endTime = time() + 5; //Если на кроне, то работает 5 секунд
    else $endTime = time() + 1; //Если на хитах, то не более 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) {
                if ($date_expire < $curentTime) {
                    unlink($file);
                }
            }
            if (time() >= $endTime) break;
        }
    }
    if (is_string($file)) {
        return "clean_expire_cache(\"" . $file . "\");";
    }
    else {
        return "clean_expire_cache();";
    }
}