PHP get_headers()的替代方法

7

我需要一个 PHP 脚本,能够读取每个 URL 请求的 HTTP 响应代码。

类似这样的:

$headers = get_headers($theURL);
return substr($headers[0], 9, 3);

问题在于get_headers()函数被服务器禁用了,这是一项政策。因此,它不起作用。

问题是如何获取URL的HTTP响应代码?

3个回答

11

如果启用了cURL,您可以使用它来获取整个标头或仅响应代码。以下代码将响应代码分配给$response_code变量:

$curl = curl_init();
curl_setopt_array( $curl, array(
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_URL => 'http://stackoverflow.com' ) );
curl_exec( $curl );
$response_code = curl_getinfo( $curl, CURLINFO_HTTP_CODE );
curl_close( $curl );

想要获取完整的头部信息,您可以发出一个 HEAD 请求,像这样:

$curl = curl_init();
curl_setopt_array( $curl, array(
    CURLOPT_HEADER => true,
    CURLOPT_NOBODY => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_URL => 'http://stackoverflow.com' ) );
$headers = explode( "\n", curl_exec( $curl ) );
curl_close( $curl );

@Matej 是的,它运行得很好,但需要注意的是,我认为我们可能无法获取他们使用的“服务器”(如Apache或iis等)以及其他一些细节。但是,要检查服务器响应代码,它运行良好。 - vkGunasekaran
@Sekar:Server 是可选的,这取决于服务器是否发送它。 - Matěj G.

4

如果可以的话,请使用HttpRequest:http://de2.php.net/manual/en/class.httprequest.php

$request = new HttpRequest("http://www.example.com/");
$request->send();
echo $request->getResponseCode();

或者你可以选择更困难的方法:http://de2.php.net/manual/zh/function.fsockopen.php

$errno = 0;
$errstr = "";

$res = fsockopen('www.example.com', 80, $errno, $errstr);

$request = "GET / HTTP/1.1\r\n";
$request .= "Host: www.example.com\r\n";
$request .= "Connection: Close\r\n\r\n";

fwrite($res, $request);

$head = "";

while(!feof($res)) {
    $head .= fgets($res);
}

$firstLine = reset(explode("\n", $head));
$matches = array();
preg_match("/[0-9]{3}/", $firstLine, $matches);
var_dump($matches[0]);

Curl也是一个不错的选择,但最好的选择是打败你的管理员 ;)

3

2
+1,但如果他有可用的curl,那么编写和维护比自己编写更容易。 - El Yobo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接