【问题标题】:Check if remote images exist PHP检查远程图像是否存在 PHP
【发布时间】:2012-05-16 09:09:39
【问题描述】:

我正在使用 last.fm API 来获取最近的曲目并搜索专辑和艺术家等。 从 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="..." /> 

这有用吗?

感谢任何帮助

【问题讨论】:

  • 很遗憾,last.fm 为您提供了一个实际上并不存在的 URL。
  • 它给了我一个有效的图像,当浏览它时,它给出了一个图像的图标,但它永远不会加载。所以我得到一个 404。

标签: php html image


【解决方案1】:

您可以使用getimagesize,因为您正在处理图像,它也会返回图像的 mime 类型

   $imageInfo = @getimagesize("http://www.remoteserver.com/image.jpg");

您还可以使用 CURL 来检查 am image 或任何 URL 的 HTTP 响应代码

$ch = curl_init("http://www.remoteserver.com/image.jpg");
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);

【讨论】:

  • 如果我必须检查每张图片,页面的加载时间会太长。
  • 只检查 HTTP 代码就更快了 .. 这就是为什么我给了这个选项... multicurl 也让它快了 10 倍
  • 请加curl_setopt($ch, CURLOPT_TIMEOUT, 2);curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
  • 有效,但我希望当有更多图像要加载时它不会杀死我的网站。 curlopt_timeout_2 有什么作用?
【解决方案2】:
function fileExists($path){
    return (@fopen($path,"r")==true);
}

来自 file_exists() 的手册

【讨论】:

    【解决方案3】:

    根据图像的数量和故障频率,最好坚持使用当前的客户端方法。此外,看起来图像是通过 Amazon CloudFront 提供的 - 在这种情况下,请使用客户端方法,因为这可能只是单个边缘服务器的传播问题。

    应用服务器端方法会占用大量网络且速度慢(浪费资源),尤其是在 php 中,因为您需要按顺序检查每个图像。

    【讨论】:

    • 这是一个很好的回复(只是因为它不再给我额外的工作,哈:))认真,感谢您的好方法
    • @turncoat 很高兴我能帮上忙 ;)
    • 我不同意 PHP 很慢 .... MULTI CURL + CURLOPT_NOBODY + CURLINFO_HTTP_CODE 更快
    • @Baba 仍然是在浪费资源(cpu、带宽等),尤其是通过 CloudFront 提供图像时。另外,它是 last.fm - 我会开一张支持票并将其留给他们的团队来解决,这是他们的责任。
    • 您知道用于检查 HTTP 代码的带宽吗?它可能会使用带宽,但没有您想象的那么糟糕.. 自己尝试一下
    【解决方案4】:

    使用get_headers php函数检查请求标头也可能有用,如下所示:

    $url = "http://www.remoteserver.com/image.jpg";
    $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
    }
    

    【讨论】:

    • 考虑到响应不包含正文内容,标头请求更快。
    【解决方案5】:

    以下函数将尝试使用get_headers 获取URL 给出的任何在线资源(IMG、PDF 等),读取标题并使用函数strpos 在其中搜索字符串“未找到”。如果找到该字符串,则表示 URL 给定的资源不可用,该函数将返回 FALSE,否则返回 TRUE。

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

    【讨论】:

      猜你喜欢
      • 2010-11-24
      • 1970-01-01
      • 2012-02-14
      • 1970-01-01
      • 2015-09-04
      • 2016-07-09
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多