php url check available available

时间:2011-06-15 12:03:47

标签: php url

我想检查我的数据库中是否有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";
?>

4 个答案:

答案 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检查。

希望能帮助。