+7 495 008 8452 пн.-пт. 10:00 – 17:00
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


Агент для удаления устаревшего кеша

Доброго времени суток!
Не смотря на простоту и удобство работы с механизмом кеширования в продукте, у него есть один существенный недостаток: не удаляется устаревший кеш. Связано это с тем, что при работе с компонентами продукт формирует уникальный путь к файлу с кешем на основании входящего параметра $cache_id, т.е. файл с кешем создаётся по определённому пути, либо перезаписывается актуальными данными, удаления какого-либо произвольного файла не предполагается по определению.

В данной статье предлагается агент, который периодически запускается, сканирует директории с кешем, вычисляет устаревший и удаляет его.

Не стал нагружать скрипт автосозданием агента, поэтому его придётся создать руками, настройки следующие:



Сам код агента, который необходимо поместить в файл /bitrix/php_interface/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; //Если на хитах, то не более секунды

   //Работаем со всем кешем
   $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();";
   }
} 


Итак, ключевые моменты.
Определяем, сколько будет работать наш агент. Если исполняется не на CRON'е, то лучше больше секунды не ставить:
if (defined("BX_CRONTAB") && BX_CRONTAB === true)
   $endTime = time()+5; //Если на кроне, то работаем 5 секунд
else
   $endTime = time()+1; //Если на хитах, то не более секунды


Благодаря коду:
if (is_string($file))
{
   return "clean_expire_cache(\"".$file."\");";
}
процесс удаления получается пошаговым, т.е. начинает он работать оттуда, где закончил.


Спасибо за внимание.

Назад в раздел

Подписаться на новые материалы раздела:












CAPTCHA