请注意,HTTP 包装器对头行有 1024 个字符的硬限制。
任何接收到的长度超过此限制的 HTTP 头将被忽略,不会出现在 $http_response_header 中。
cURL 扩展没有此限制。
http_fopen_wrapper.c: #define HTTP_HEADER_BLOCK_SIZE 1024
(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)
$http_response_header — HTTP 响应头
$http_response_header 数组 类似于 get_headers() 函数。当使用 HTTP 包装器 时,$http_response_header 将填充 HTTP 响应头。 $http_response_header 将在 局部作用域 中创建。
示例 #1 $http_response_header 示例
<?php
function get_contents() {
file_get_contents("http://example.com");
var_dump($http_response_header); // 变量在局部作用域中填充
}
get_contents();
var_dump($http_response_header); // 对 get_contents() 的调用不会在函数作用域外填充变量
?>
上面的示例将输出类似于
array(9) { [0]=> string(15) "HTTP/1.1 200 OK" [1]=> string(35) "Date: Sat, 12 Apr 2008 17:30:38 GMT" [2]=> string(29) "Server: Apache/2.2.3 (CentOS)" [3]=> string(44) "Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT" [4]=> string(27) "ETag: "280100-1b6-80bfd280"" [5]=> string(20) "Accept-Ranges: bytes" [6]=> string(19) "Content-Length: 438" [7]=> string(17) "Connection: close" [8]=> string(38) "Content-Type: text/html; charset=UTF-8" } Warning: Undefined variable $http_response_header NULL
请注意,HTTP 包装器对头行有 1024 个字符的硬限制。
任何接收到的长度超过此限制的 HTTP 头将被忽略,不会出现在 $http_response_header 中。
cURL 扩展没有此限制。
http_fopen_wrapper.c: #define HTTP_HEADER_BLOCK_SIZE 1024
解析函数以获取格式化的头(带响应代码)
<?php
function parseHeaders( $headers )
{
$head = array();
foreach( $headers as $k=>$v )
{
$t = explode( ':', $v, 2 );
if( isset( $t[1] ) )
$head[ trim($t[0]) ] = trim( $t[1] );
else
{
$head[] = $v;
if( preg_match( "#HTTP/[0-9\.]+\s+([0-9]+)#",$v, $out ) )
$head['reponse_code'] = intval($out[1]);
}
}
return $head;
}
print_r(parseHeaders($http_response_header));
/*
Array
(
[0] => HTTP/1.1 200 OK
[reponse_code] => 200
[Date] => Fri, 01 May 2015 12:56:09 GMT
[Server] => Apache
[X-Powered-By] => PHP/5.3.3-7+squeeze18
[Set-Cookie] => PHPSESSID=ng25jekmlipl1smfscq7copdl3; path=/
[Expires] => Thu, 19 Nov 1981 08:52:00 GMT
[Cache-Control] => no-store, no-cache, must-revalidate, post-check=0, pre-check=0
[Pragma] => no-cache
[Vary] => Accept-Encoding
[Content-Length] => 872
[Connection] => close
[Content-Type] => text/html
)
*/
?>
如果没有建立连接,$http_response_header 不会重置!(在 php 7.0/8.1 上测试)
file_get_contents("https://www.google.com/");
file_get_contents("https://www.google.fail/");
print_r($http_response_header);//Array ( [0] => HTTP/1.1 200 OK ....
如果遇到 HTTP 重定向,头将包含遇到的所有请求的响应行和头。考虑这个例子
<?php
file_get_contents("https://httpbin.org/redirect-to?url=https%3A%2F%2Fhttpbin.org%2F");
var_dump($http_response_header);
?>
产生以下结果
array(23) {
[0]=>
string(18) "HTTP/1.1 302 FOUND"
[1]=>
string(17) "Connection: close"
[2]=>
string(22) "Server: meinheld/0.6.1"
[3]=>
string(35) "Date: Tue, 06 Feb 2018 11:21:21 GMT"
[4]=>
string(38) "Content-Type: text/html; charset=utf-8"
[5]=>
string(17) "Content-Length: 0"
[6]=>
string(30) "Location: https://httpbin.org/"
[7]=>
string(30) "Access-Control-Allow-Origin: *"
[8]=>
string(38) "Access-Control-Allow-Credentials: true"
[9]=>
string(19) "X-Powered-By: Flask"
[10]=>
string(34) "X-Processed-Time: 0.00107908248901"
[11]=>
string(14) "Via: 1.1 vegur"
[12]=>
string(15) "HTTP/1.1 200 OK"
[13]=>
string(17) "Connection: close"
[14]=>
string(22) "Server: meinheld/0.6.1"
[15]=>
string(35) "Date: Tue, 06 Feb 2018 11:21:21 GMT"
[16]=>
string(38) "Content-Type: text/html; charset=utf-8"
[17]=>
string(21) "Content-Length: 13011"
[18]=>
string(30) "Access-Control-Allow-Origin: *"
[19]=>
string(38) "Access-Control-Allow-Credentials: true"
[20]=>
string(19) "X-Powered-By: Flask"
[21]=>
string(34) "X-Processed-Time: 0.00848388671875"
[22]=>
string(14) "Via: 1.1 vegur"
}
请记住,这个特殊变量在某种程度上是受保护的,在对端服务器过早关闭连接(SSL 重置)时,在某些情况下不会被填充
=> Undefined variable: http_response_header
像这样的代码
$response = @file_get_contents($url);
empty($http_response_header) && $http_response_header = array('HTTP/1.1 400 Bad request');
将返回一个神秘的错误消息
Fatal error: Call to undefined function array() on line 2
--
如果您想应对这种情况
$hdrs = array('HTTP/1.1 400 Bad request');
!empty($htp_response_header) && $hdrs = $http_response_headers;
现在使用 $hdrs 代替 $http_response_header
似乎,如果服务器返回 HTTP/1.1 100 Continue,变量 $http_response_header 将被取消设置。这种情况可能难以检测到。
出于这个和其他原因,我建议使用 PHP cURL,而不是 file_get_contents()。