检查远程URL上是否存在图像

Cri*_*van 50 php url curl image

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

小智 91

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

- >如果您的主机支持curl,这是最快的方法

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

小智 57

像这样使用getimagesize()方法

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

  • 直接来自http://php.net/manual/en/function.getimagesize.php - "不要使用getimagesize()来检查给定文件是否是有效图像.请使用专用的解决方案,例如Fileinfo扩展名".此方法下载文件并且不如可以通过HEAD检查的任何方法 (13认同)
  • 简单的解决方案但很慢 (3认同)
  • 对于@TimRamsey的评论,问题来自非图像文件,因此您验证文件类型是您应该没问题的图像.优雅的解决方案btw. (2认同)

Chs*_*y76 6

这里没有"简单"的方法 - 您至少需要生成一个HEAD请求并检查生成的内容类型以确保它是一个图像.这没有考虑可能的推荐人问题.卷曲是去这里的方式.

  • 我认为做一个卷曲请求而不提取身体是一种简单的方法. (2认同)

Jai*_*han -1

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