• Модуль: landing
  • Путь к файлу: ~/bitrix/modules/landing/lib/agent.php
  • Класс: BitrixLandingAgent
  • Вызов: Agent::checkFileExists
static function checkFileExists(int $fileId): string
{
	$file = CFile::getFileArray($fileId);
	if (!$file)
	{
		return '';
	}
	if (!$file['SRC'] || !preg_match('#^(https?://)#', $file['SRC']))
	{
		return '';
	}
	$request = new HttpClient(["redirect" => false,]);
	$request->query(HttpClient::HTTP_HEAD, $file['SRC']);
	if ($request->getStatus() !== 200)
	{
		$filesToDelete = [$fileId];

		// find duplicates of file
		$originals = FileDuplicateTable::getList([
			'select' => ['ORIGINAL_ID'],
			'filter' => [
				'DUPLICATE_ID' => $fileId,
			],
		]);
		while ($original = $originals->fetch())
		{
			$filesToDelete[] = (int)$original['ORIGINAL_ID'];
		}

		$duplicates = FileDuplicateTable::getList([
			'select' => ['DUPLICATE_ID'],
			'filter' => [
				'ORIGINAL_ID' => $filesToDelete,
			],
		]);
		while ($duplicate = $duplicates->fetch())
		{
			$filesToDelete[] = (int)$duplicate['DUPLICATE_ID'];
		}

		$filesToDelete = array_unique($filesToDelete);

		// clear LandingFile table
		$landingFiles = FileTable::getList([
			'select' => ['ID', 'ENTITY_ID'],
			'filter' => [
				'ENTITY_TYPE' => File::ENTITY_TYPE_ASSET,
				'=FILE_ID' => $filesToDelete,
			],
		]);
		$landingsToUpdate = [];
		while ($landingFile = $landingFiles->fetch())
		{
			FileTable::delete((int)$landingFile['ID']);
			$landingsToUpdate[] = (int)$landingFile['ENTITY_ID'];
		}
		$landingsToUpdate = array_unique($landingsToUpdate);

		// find landings for drop public cache
		if (Manager::isB24())
		{
			$sites = Landing::getList([
				'select' => ['SITE_ID'],
				'filter' => [
					'=ID' => $landingsToUpdate,
				],
			]);
			while ($site = $sites->fetch())
			{
				Site::update((int)$site['SITE_ID'], []);
			}
		}

		foreach ($filesToDelete as $fileToDelete)
		{
			CFile::delete($fileToDelete);
		}
	}

	return '';
}