• Модуль: disk
  • Путь к файлу: ~/bitrix/modules/disk/lib/internals/cleaner.php
  • Класс: BitrixDiskInternalsCleaner
  • Вызов: Cleaner::deleteVersionsByTtl
static function deleteVersionsByTtl($type = self::DELETE_TYPE_PORTION, $limit = 10): void
{
	$dayLimit = Configuration::getFileVersionTtl();
	if ($dayLimit === -1)
	{
		return;
	}

	$portion = $limit;
	if ($type === self::DELETE_TYPE_TIME)
	{
		$portion = 100;
	}

	$connection = Application::getConnection();
	$ttlTime = $connection->getSqlHelper()->convertToDbDateTime(
		DateTime::createFromTimestamp(time() - $dayLimit * 86400)
	);

	$result = $connection->query( "
		SELECT v.ID
		FROM b_disk_version v
		INNER JOIN b_disk_object obj ON obj.ID = v.OBJECT_ID
		LEFT JOIN b_disk_attached_object atta ON v.OBJECT_ID = atta.OBJECT_ID AND v.ID = atta.VERSION_ID
		WHERE
			atta.OBJECT_ID IS NULL AND
			v.CREATE_TIME < {$ttlTime} AND
			v.FILE_ID <> obj.FILE_ID
		ORDER BY v.ID ASC
		LIMIT {$portion}
	");

	$versionIds = [];
	foreach ($result as $row)
	{
		$versionIds[] = $row['ID'];
	}

	if (!$versionIds)
	{
		return;
	}

	$versions = Version::getModelList([
		'filter' => [
			'@ID' => $versionIds,
		]
	]);

	$startTime = time();
	foreach ($versions as $version)
	{
		if ($type === self::DELETE_TYPE_TIME && (time() - $startTime > $limit))
		{
			break;
		}

		$version->delete(SystemUser::SYSTEM_USER_ID);
	}
}