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

发布于 2024-12-11 12:05:17 字数 878 浏览 0 评论 0原文

到目前为止,我已经使用了 2 种不同的方法来检查 url:

$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;

只是不确定如何使这些请求在指定的秒数后超时。当网址不存在时,我的脚本会挂起几分钟,然后才最终返回离线状态。有什么想法吗?

解决方案:

使用 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);

I've used 2 different methods of checking the url so far:

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

and

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

I'm just not sure how I can make these requests time out after a specified number of seconds. My script hangs for minutes, when a url doesn't exist, before it finally comes back as offline status. Any ideas?

SOLUTION:

Used Curl to set the timeout using the following code:

$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);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

煮酒 2024-12-18 12:05:17

您必须启用自己的 fsockopen() 并启用 URL 处理程序,这样您就可以指定超时。但是,您将不得不从头开始构建自己的 HTTP 请求,因此更好的解决方案是使用 curl。您可以轻松地在其中构造一个头请求,并使用 CURLOPT_CONNECTIMEOUT (用于连接)和 CURLOPT_TIMEOUT (一般整体超时)指定超时。

You'll have to roll your own fsockopen() with URL handlers enabled, which lets you specify a timeout. But then you're stuck building your own HTTP request from the ground up, so a better solution is to use curl. You can easily construct a head request in there, and specify a timeout with CURLOPT_CONNECTIMEOUT (for connecting) and CURLOPT_TIMEOUT (general overall timeout).

紫轩蝶泪 2024-12-18 12:05:17

您可以为此使用流上下文。请参阅:https://www.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< /a>.如果您想获取响应的标头,则必须访问特殊的全局$http_response_header

You can use stream contexts for this. See: https://www.php.net/manual/en/context.http.php.

You can create a context with a short timeout and a method of HEAD, and use file_get_contents() to fetch it.

A quick example:

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

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

This requires HTTP wrappers to be enabled; see: http://php.net/manual/en/wrappers.http.php. If you want to get at the headers of the response, you must access the special global $http_response_header.

榆西 2024-12-18 12:05:17

尝试 stream_set_timeout 函数:

try the stream_set_timeout function:

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文