【问题标题】:Validating many image urls in PHP WITHOUT downloading在不下载的情况下验证 PHP 中的许多图像 url
【发布时间】:2013-07-10 10:28:11
【问题描述】:

注意:这是一个性能问题

我在 mysql 数据库中有 20,000 个图像 url,我有一个 1 分钟间隔的 cron 运行来检查图像 url 是否有效且没有损坏。它在小型 EC2 上运行。我尝试过@GetImageSize 等方法,检查标题和 cURL,但它们最多需要 10 分钟才能完成工作。想看看有没有什么方法可以不用下载图片,而且速度极快。

以下是对一些循环中的 25 张图片的以下建议的一些测试(致谢和赞扬):

function method2($link){                               //45sec
    if (@GetImageSize($link)) {
        echo  "image exists ";
    } 
}

function method4($url){                            //13 sec
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    if(curl_exec($ch)!==FALSE)    {
            echo  "image exists ";
    }
}


function method3($filename){                          //20sec
    $h = fopen($filename, 'r');
    if ($h !== false) {
        echo 'File exists';
            fclose($h);
    }
}

function method5($url){                             //21 sec 
    if(@file_get_contents($url,0,NULL,0,1)){
        echo "image exists";
    }
}

function method6($url){                             //22 sec
    if (false === file_get_contents($url,0,null,0,1)) {
        echo "no ";
    }
}

function method1($url){                                //13 sec
    exec("wget --spider -v ".$url);
}

【问题讨论】:

  • 是的,我认为这不太现实。但我仍在努力寻找最快的解决方案。出于性能原因,它们存储在 S3 中,而不是 Web 服务器上。
  • 不,不是我的桶。我们正在与之合作的外部方。但让我们继续讨论技术层而不是业务层。
  • 最快的方法通常应该是 parallelized HEAD 请求。顺序请求不起作用,因为您需要 3 毫秒的响应时间才能在一分钟内循环 20,000 个请求。通过 Internet 请求 URL 时期望 3 毫秒的响应完全不适合现实(如果幸运的话,您将获得 100 毫秒的平均响应时间^^)。
  • 我明白了 - 感谢您的见解。你是指curl_multi_exec 还是别的什么——我会测试一下。
  • 添加了建议的解决方案和结果,供社区参考。

标签: php image url curl amazon-ec2


【解决方案1】:

如果allow_url_fopen 在您的主机上处于“开启”状态,那么您可以fopen 该 URL 并关闭它而不读取任何内容。

$h = fopen('http://www.example.com/img.jpg', 'r');
if ($h !== false) {
    echo 'File exists';
    fclose($h);
else {
    echo 'File does not exist';
}

由于您似乎与目标服务器的所有者保持联系,也许您应该完全采用另一种方法。调用您将在远程服务器上托管的脚本,该脚本返回文件系统中存在的文件列表。然后从你端调用这个脚本。这在任何情况下都是可取的,因为每分钟 20k 的请求都很难达到目标。

【讨论】:

  • 谢谢。感谢您的回答。我刚刚测试了它,但它仍然比使用 cURL 慢 35% : (
  • 然后尝试系统调用wget --spider
  • @George 根据您上一次的 cmets,我建议另一种方法。请检查我的编辑。
【解决方案2】:

您可以使用像“file_exists”这样的 php 函数。有关更多信息,请点击该链接 http://php.net/manual/en/function.file-exists.php

或者使用这个

$file = 'http://www.abc.com/somefile.jpg';
$file_headers = @get_headers($file);
if($file_headers[0] == 'HTTP/1.1 404 Not Found') {
    $exists = false;
}
else {
    $exists = true;
}

【讨论】:

    猜你喜欢
    • 2019-03-25
    • 2016-03-25
    • 2017-09-04
    • 1970-01-01
    • 2021-05-26
    • 2012-08-05
    • 2011-06-26
    • 2021-06-04
    相关资源
    最近更新 更多