$http_response_header

$http_response_headerHTTP 响应头

说明

$http_response_header 数组get_headers() 函数类似。当使用HTTP 包装器时,$http_response_header 将会被 HTTP 响应头信息填充。$http_response_header 将被创建于局部作用域中。

范例

Example #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);
?>

以上例程的输出类似于:

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=gb2312"
}
NULL

User Contributed Notes

boz at reyboz dot it 02-Jul-2021 11:10
It seems that, if the server returns an HTTP/1.1 100 Continue, the variable $http_response_header is unset. This corner case may be difficult to be detected.

For this and other reasons I recommend PHP cURL, instead of file_get_contents().
jaraco at jaraco dot com 06-Feb-2018 11:20
If an HTTP Redirect is encountered, the headers will contain the response line and headers for all requests encountered. Consider this example:

<?php
file_get_contents
("https://httpbin.org/redirect-to?url=https%3A%2F%2Fhttpbin.org%2F");
var_dump($http_response_header);
?>

Produces the following:

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=gb2312"
  [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=gb2312"
  [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"
}
doekia at gmail dot com 20-Jun-2017 10:54
Bear in mind this special variable is somehow protected and not populated in some situation when the peer server close the connection early on (ssl reset)
=> Undefined variable: http_response_header

A code like this one:
$response = @file_get_contents($url);
empty($http_response_header) && $http_response_header = array('HTTP/1.1 400 Bad request');

Will return a cryptic error message:
Fatal error: Call to undefined function  array() on line 2

--
Should you want to cope with this situation:
$hdrs = array('HTTP/1.1 400 Bad request');
!empty($htp_response_header) && $hdrs = $http_response_headers;

Now use $hdrs in place of $http_response_header
MangaII 01-May-2015 01:01
parser function to get formatted headers (with response code)

<?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
)
*/

?>
nicolas at toniazzi dot net 01-Oct-2013 01:42
Note that the HTTP wrapper has a hard limit of 1024 characters for the header lines.
Any HTTP header received that is longer than this will be ignored and won't appear in $http_response_header.

The cURL extension doesn't have this limit.

http_fopen_wrapper.c: #define HTTP_HEADER_BLOCK_SIZE 1024
PHP8中文手册 站长在线 整理 版权归PHP文档组所有