【发布时间】: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