我想检查我的数据库中是否有url可用。我选择fopen
,但是我从我的数据库中测试了30行,这将耗费近20秒。有什么办法可以让它更有效率吗?感谢。
<?php
$start_t = microtime(true);
//connect database and select query
while ($row = mysql_fetch_array($result)){
//$url = 'http://www.google.com'; //not test from database, but a google.com, one url will cost 0.49 seconds.
$url = $row['url'];
$res = @fopen($url, "r ");
if($res){
echo $row['url'].' yes<br />';
}else{
echo $row['url']. ' no<br />';
}
}
$end_t = microtime(true);
$totaltime = $end_t-$start_t;
echo "<br />".$totaltime." s";
?>
答案 0 :(得分:3)
尝试使用比fsockopen
fopen
<?php
$t = microtime(true);
$valid = @fsockopen("www.google.com", 80, $errno, $errstr, 30);
echo (microtime(true)-$t);
if (!$valid) {
echo "Failure";
} else {
echo "Success";
}
?>
输出:
0.0013298988342285
答案 1 :(得分:2)
您可以尝试将CURL与CURLOPT_NOBODY选项集一起使用,该选项使用HTTP HEAD方法并避免下载整个页面:
$ch = curl_init($row['url']);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_exec($ch);
$retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// 400 means not found, 200 means found.
curl_close($ch);
来自CURLOPT_NOBODY documentation:
是的,以排除身体 输出。然后将请求方法设置为 头。将此值更改为FALSE则不会 把它改成GET。
答案 2 :(得分:1)
你无法加快速度。
有30行我假设你连接到30个不同的网址。 20秒已经是个好时机了。
另外,我建议您使用file_get_contents
来检索HTML
或者,如果您需要知道标题回复,请使用get_headers();
如果你想加快这个过程只会产生更多的过程。他们每个人都会获取一个tot
网址。
另外,不要忘记对此类任务非常有用的伟大Zend_HTTP_Client();
答案 3 :(得分:1)
尝试批量URL检查,即10或20块
Curl Multi Exec。
http://semlabs.co.uk/journal/object-oriented-curl-class-with-multi-threading
仅限NOBODY和HEADER使用CURL选项,因此您的响应会更快。
另外不要忘记将TIMEOUT用于卷曲,否则一个BAD网址可能会花费太多时间。
我在20秒内完成了50次URL检查。
希望能帮助。