Подтвердить что ты не робот

Проверьте, существует ли изображение на удаленном URL-адресе

Я создаю динамические URL-адреса изображений для книжных ISBN. Мне нужен надежный способ с PHP, чтобы проверить, действительно ли изображения существуют на удаленном URL-адресе. Я пробовал различные подходы с различными библиотеками PHP, завитки и т.д., Но ни один из них не работает хорошо, некоторые из них совершенно медленны. Учитывая тот факт, что мне нужно сгенерировать (и проверить!) Около 60 URL-адресов для каждой книги в моей базе данных, это огромное время ожидания. Любые подсказки?

4b9b3361

Ответ 1

function checkRemoteFile($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);
    // don't download content
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $result = curl_exec($ch);
    curl_close($ch);
    if($result !== FALSE)
    {
        return true;
    }
    else
    {
        return false;
    }
}

→ это самый быстрый способ, если ваш хост поддерживает curl

Ответ 2

Используйте метод getimagesize(), подобный этому

$external_link = ‘http://www.example.com/example.jpg’;
if (@getimagesize($external_link)) {
echo  "image exists ";
} else {
echo  "image does not exist ";
}

Ответ 3

Здесь нет "простого" способа - по крайней мере, вам нужно сгенерировать запрос HEAD и проверить полученный тип контента, чтобы убедиться, что это изображение. Это не учитывает возможные проблемы с реферерами. curl - путь сюда.

Ответ 4

Вы можете использовать curl. Просто установите для параметра curl CURLOPT_NOBODY значение true. Это будет пропускать информацию о теле и получить только голову (таким образом, http-код). Затем вы можете использовать CURLOPT_FAILONERROR, чтобы превратить весь этот процесс в проверку истинного/ложного типа

Ответ 6

Я делаю это для моего отслеживания картины недвижимости...

$im = @imagecreatefromjpeg($pathtoimg);
if($im)
  imagedestroy($im); // dont save, just ack...
elseif(!$missing[$inum])
  $img404arr[] = $inum;

Это кажется "быстрее", чем загрузка фактического изображения, и занимает около 0,3 секунды для каждого из изображений, которые avg 100k.

Мне жаль, что я не могу просто проверить заголовок и прочитать, получаю ли я 200 против 404, не загружая ничего. У кого-нибудь есть что-то удобное?

Ответ 7

Это, вероятно, немой момент в этой точке, но это работает для меня:

function is_webfile($webfile)
{
 $fp = @fopen($webfile, "r");
 if ($fp !== false)
  fclose($fp);

 return($fp);
}

Ответ 8

Решение от https://www.experts-exchange.com

<?php
function url_exists($url) {
    if (!$fp = curl_init($url)) return false;
    return true;
}
?>

Ответ 9

Если все изображения существуют на одном и том же удаленном сервере (или в той же сети), вы можете запустить веб-службу на этом сервере, которая проверит файловую систему для файла изображения и вернет значение bool, указывающее, что изображение существует или нет.