Проверьте, существуют ли удаленные изображения PHP

Я использую API last.fm для получения последних треков и поиска альбомов и исполнителей и т. Д. Когда изображения возвращаются из API, их иногда не существует. Пустую строку URL-адреса легко заменить образ-заполнителем, но когда задан URL-адрес изображения, и он возвращает 404, вот тогда и возникает моя проблема.

Я попытался использовать fopen ($ url, 'r') для проверки доступности изображений, но иногда это дает мне следующую ошибку:

Warning: fopen(http://ec1.images-amazon.com/images/I/31II3Cn67jL.jpg) [function.fopen]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in file.php on line 371 

Кроме того, я не хочу использовать cURL, потому что есть много изображений для проверки, и это замедляет работу сайта.

Какое лучшее решение для проверки изображений? Теперь я использую следующее решение:

  <img src="..." onerror='this.src="core/img/no-image.jpg"' alt="..." title="..." /> 

Это полезно?

Любая помощь приветствуется

Вы можете использовать getimagesize так как вы имеете дело с изображениями, это также возвращает тип mime изображения

  $imageInfo = @getimagesize("http://img.ruphp.com/php/f"); 

Вы также можете использовать CURL для проверки кода ответа HTTP на image или любой URL

 $ch = curl_init("http://img.ruphp.com/php/f"); curl_setopt($ch, CURLOPT_NOBODY, true); curl_setopt($ch, CURLOPT_TIMEOUT, 2); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2); curl_exec($ch); if(curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200) { // Found Image } curl_close($ch); 
 function fileExists($path){ return (@fopen($path,"r")==true); } 

из руководства для file_exists ()

В зависимости от количества изображений и частоты сбоев, вероятно, лучше придерживаться вашего текущего подхода на стороне клиента. Кроме того, похоже, что изображения подаются через Amazon CloudFront – в этом случае используйте подход на стороне клиента, потому что это может быть просто проблема распространения с одним пограничным сервером.

Применение подхода на стороне сервера будет интенсивным и медленным в сети (тратой ресурсов), особенно в php, потому что вам нужно будет последовательно проверять каждое изображение.

Также может быть полезно проверить заголовки запросов, используя функцию get_headers php следующим образом:

 $url = "http://img.ruphp.com/php/f"; $imgHeaders = @get_headers( str_replace(" ", "%20", $url) )[0]; if( $imgHeaders == 'HTTP/1.1 200 Ok' ) { //img exist } elseif( $imgHeaders == 'HTTP/1.1 404 Not Found' ) { //img doesn't exist } 

Следующая функция попытается получить любой онлайн-ресурс (IMG, PDF и т. Д.), get_headers по URL-адресу, используя get_headers , читать заголовки и искать в нем строку «Not Found» с использованием функции strpos . Если эта строка найдена, то есть ресурс, заданный по URL-адресу, недоступен, эта функция вернет FALSE, иначе TRUE.

 function isResourceAvaiable($url) { return !strpos(@get_headers($url)[0],'Not Found')>0; }