【问题标题】:Check whether image exists on remote URL检查远程 URL 上是否存在图像
【发布时间】:2010-11-24 17:40:25
【问题描述】:

我正在为图书 ISBN 生成图片的动态 URL。我需要一种可靠的 PHP 方法来检查图像是否实际存在于远程 url。我用不同的 PHP 库、curl 等尝试了各种方法,但没有一个能很好地工作,其中一些非常慢。鉴于我需要为数据库中的每本书生成(并检查!)大约 60 个 URL,这是一个巨大的等待时间。有什么线索吗?

【问题讨论】:

标签: php url image curl


【解决方案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,这是最快的方法

【讨论】:

  • 我认为这是该问题的最佳答案。由于将 CURLOPT_NOBODY 选项设置为 true,这将非常快。
  • 对我来说,这个函数总是返回 true,即使我提供了错误的图片 URL。
  • 不错的答案,但我建议使用return curl_exec( $ch ) !== FALSE; 而不是if/else
  • 我在 44 个 YouTube 拇指 URL 上多次测试了所有提到的方法。结果:curl:1.8s,file_get_contents:2.6s,getimagesize:4.5s,imagecreatefromjpeg:4.7s
  • 最后别忘了curl_close($ch);
【解决方案2】:

像这样使用getimagesize()方法

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

【讨论】:

  • 直接来自php.net/manual/en/function.getimagesize.php - “不要使用 getimagesize() 来检查给定文件是否为有效图像。请改用专用解决方案,例如 Fileinfo 扩展。”此方法下载文件,不如任何只能通过 HEAD 进行检查的方法
  • 对于@TimRamsey 的评论,问题来自非图像文件,因此您验证文件类型是您应该没问题的图像。顺便说一句,优雅的解决方案。
  • 简单的解决方案但是很慢
  • @Praesagus - 虽然您可能“OK”,但与仅在请求中获取 HEAD 相比,此解决方案仍然较差(慢)。 dangkhoaweb 的回答显示了如何做到这一点。
【解决方案3】:

这里没有“简单”的方法 - 至少,您需要生成 HEAD 请求并检查生成的内容类型以确保它是图像。这没有考虑到可能的推荐人问题。 curl 是这里的方法。

【讨论】:

  • 我认为在不获取正文的情况下进行 curl 请求是一种简单的方法。
【解决方案4】:

您可以使用curl。只需将 curl 选项 CURLOPT_NOBODY 设置为 true。这将跳过正文信息,只获取头部(因此也是 http 代码)。然后,您可以使用 CURLOPT_FAILONERROR 将整个过程变成真/假类型检查

【讨论】:

    【解决方案5】:

    我一直在为我的房地产图片跟踪这样做......

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

    它“似乎”比下载实际图像要快,从平均 100k 的图像中下载每个图像大约需要 0.3 秒。

    我希望我可以在不下载任何内容的情况下进行标头检查并读取是否得到 200 和 404。谁有这个方便的?

    【讨论】:

      【解决方案6】:

      【讨论】:

      • 仅链接的答案在 SO 上不被视为有价值。
      【解决方案7】:
      if(@getimagesize($remoteImageURL)){
          //image exists!
      }else{
          //image does not exist.
      }
      

      【讨论】:

        【解决方案8】:

        目前可能还没有实际意义,但这对我有用:

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

        【讨论】:

        • 尽量避开at-operator。
        • @TörökGábor 绝对是一个好建议,但不是重点 - 手册:If the open fails, an error of level E_WARNING is generated. You may use @ to suppress this warning.
        【解决方案9】:

        来自https://www.experts-exchange.com的解决方案

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

        【讨论】:

          【解决方案10】:

          如果图像都存在于同一个远程服务器上(或在同一个网络中),您可以在该服务器上运行一个 Web 服务,该服务将检查文件系统中的图像文件并返回一个布尔值指示图像是否存在与否。

          【讨论】:

          • 我们说的是很多网站,不在我的控制范围内,所以排除了网络服务的可能性。
          猜你喜欢
          • 2012-05-16
          • 1970-01-01
          • 2014-11-18
          • 2015-08-15
          • 2016-07-09
          • 2011-08-20
          • 1970-01-01
          • 2012-03-01
          • 2012-02-14
          相关资源
          最近更新 更多