• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/data/cacheenginefiles.php
  • Класс: BitrixMainDataCacheEngineFiles
  • Вызов: CacheEngineFiles::delayedDelete
static function delayedDelete($count = 1)
{
	$con = MainApplication::getConnection();

	$etime = time() + 2;
	if ($count > 0)
	{
		$rs = $con->query("SELECT * from b_cache_tag WHERE TAG='*'", 0, $count);
		while ($ar = $rs->fetch())
		{
			static::deleteOneDir($etime, $ar);
			if (time() > $etime)
				break;
		}
	}

	//try to adjust cache cleanup speed to cache cleanups
	$rs = $con->query("SELECT SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG from b_cache_tag WHERE TAG='**'");
	if ($ar = $rs->fetch())
	{
		$statRecFound = true;
		$lastCount = intval($ar["RELATIVE_PATH"]);
		if (preg_match("/:(\d+)$/", $ar["RELATIVE_PATH"], $m))
			$lastTime = intval($m[1]);
		else
			$lastTime = 0;
	}
	else
	{
		$statRecFound = false;
		$lastCount = 0;
		$lastTime = 0;
	}

	$toDeleteCount = $con->queryScalar("SELECT count(1) CNT from b_cache_tag WHERE TAG='*'");

	$delta = $toDeleteCount - $lastCount;
	if ($delta > 0)
	{
		$timeStep = ($lastTime > 0? time() - $lastTime: 0);
		if ($timeStep <= 0)
			$timeStep = 1;
		$count = intval($toDeleteCount * $timeStep / 3600) + 1; //Rest of the queue in an hour
	}
	elseif ($count < 1)
	{
		$count = 1;
	}

	if ($statRecFound)
	{
		if ($lastCount != $toDeleteCount)
			$con->queryExecute("UPDATE b_cache_tag SET RELATIVE_PATH='".$toDeleteCount.":".time()."' WHERE TAG='**'");
	}
	else
	{
		$con->queryExecute("INSERT INTO b_cache_tag (TAG, RELATIVE_PATH) VALUES ('**', '".$toDeleteCount.":".time()."')");
	}

	if ($toDeleteCount > 0)
		return "\Bitrix\Main\Data\CacheEngineFiles::delayedDelete(".$count.");";
	else
		return "";
}