Я использую 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; }