2012-03-30 35 views
2

我有超过5000个图像链接,我需要找到一种方法来检查它们是否存在。我用getimagesize(),但花了太长时间。速度对我至关重要。PHP:检查图像是否存在(方法)

我写了一个小函数,但它不工作,我不知道为什么。

function img_exists($url) 
{ 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

    if(curl_exec($ch)) 
     return true; 
    else 
     return false; 

    curl_close($ch); 
} 

目前我正在使用PHP进行检查。请让我知道是否有更好的解决方案。

请注意,如果连接超时(1秒),则函数返回false。速度至关重要。

更新:文件位于不同的服务器上。

+0

的图像是远程或此脚本正在同一主机空间运行图像?如果是这样,可以使用'file_exists()' – RedactedProfile 2012-03-30 21:02:17

回答

4

如果可以,curl_multi_*函数应该使整个过程更快,请检查manual

而且,只是在做一个HEAD请求(而不是GET)会为你节省相当长的一段字节/次,补充一点:

curl_setopt_array($ch, array(CURLOPT_HEADER => true, CURLOPT_NOBODY => true)); 
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'HEAD'); 
+0

如果你不想看到HEAD结果,添加curl_setopt($ ch,CURLOPT_RETURNTRANSFER,1); – Acyra 2016-02-27 17:10:06

2

如果你有赤自己的服务器上的文件,你可以简单地使用file_exists() - 如果你需要检查远程文件并已启用allow_url_fopen,你可以使用fopen()这样的:

function url_exists($path){ 
    return (@fopen($path,"r")==true); 
} 

一个小纸条到你的函数中:你在返回一个值之后试图调用curl_close(),所以这个语句是无意义的,因为它永远不会被达到(并且可能会导致内存泄漏,因为你永远不会关闭流)。

+0

你可以添加一个自定义超时fopen? – haltabush 2012-03-30 21:12:53

+1

@haltabush你可以超时fsockopen – safarov 2012-03-30 21:14:00