如何检查PHP是否存在url并在几秒钟后使其超时

时间:2011-10-21 15:52:06

标签: php url timeout

到目前为止,我使用了两种不同的方法来检查网址:

$h = @get_headers($url);
$status = array();
preg_match('/HTTP\/.* ([0-9]+) .*/', $h[0] , $status);
return ($status[1] == 200);

$file_headers = @get_headers($url);
if($file_headers[0] == 'HTTP/1.1 404 Not Found') {
$exists = false;
}
else {
    $exists = true;
}
return $exists;

我只是不确定如何在指定的秒数后让这些请求超时。我的脚本会挂起几分钟,当一个url不存在时,它最终会以脱机状态返回。有什么想法吗?

解决方案:

使用Curl使用以下代码设置超时:

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt($curl, CURLOPT_NOBODY, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($curl);
curl_close($curl);
preg_match("/HTTP\/1\.[1|0]\s(\d{3})/",$data,$matches);
return ($matches[1] == 200);

3 个答案:

答案 0 :(得分:4)

您必须在启用了URL处理程序的情况下滚动自己的fsockopen(),这样您就可以指定超时。但是,您仍然无法从头开始构建自己的HTTP请求,因此更好的解决方案是使用curl。您可以在那里轻松构造头请求,并使用CURLOPT_CONNECTIMEOUT(用于连接)和CURLOPT_TIMEOUT(一般总超时)指定超时。

答案 1 :(得分:1)

您可以为此使用流上下文。请参阅:http://us2.php.net/manual/en/context.http.php

您可以使用短暂超时和HEAD方法创建上下文,并使用file_get_contents()来获取它。

一个简单的例子:

$context = stream_context_create(array('http' => array(
    'method' => 'HEAD',
    'timeout' => 10
)));

$response = file_get_contents($url, false, $context);
$exists = ($response !== false);

这需要启用HTTP包装器;见:http://php.net/manual/en/wrappers.http.php。如果您想了解回复的标题,则必须访问特殊的全局$http_response_header

答案 2 :(得分:0)

尝试stream_set_timeout功能: