-1

注意:这是一个性能问题

我在 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);
}
4

2 回答 2

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 请求确实很难达到目标。

于 2013-07-10T10:35:02.923 回答
0

您可以使用像“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;
}
于 2013-07-10T10:34:12.013 回答