【问题标题】:PHP: check if image exists (methods)PHP:检查图像是否存在(方法)
【发布时间】:2012-04-14 13:44:00
【问题描述】:

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

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

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。速度很关键。

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

【问题讨论】:

  • 图像是远程的,还是这个脚本与图像在同一个托管空间上运行?如果是这样可以使用file_exists()

标签: php curl file-exists


【解决方案1】:

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

此外,只需执行 HEAD 请求(而不是 GET)将为您节省相当多的字节/时间,添加以下内容:

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

【讨论】:

  • 如果不想看到 HEAD 结果,添加 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
【解决方案2】:

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

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

对你的函数的一点说明:你试图在返回一个值后调用curl_close(),所以这个语句是没有意义的,因为它永远不会到达(并且可能导致内存泄漏,因为你永远不会关闭流)。

【讨论】:

  • 你可以为 fopen 添加自定义超时吗?
  • @haltabush 你可以为 fsockopen 超时
猜你喜欢
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 2012-02-14
  • 2011-03-20
相关资源
最近更新 更多