• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • $http_response_header

    HTTP 响应头

    说明

    $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=UTF-8"
    }
    NULL
    
    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
    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=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"
    }
    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
    )
    */
    ?>
    
    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

    上篇:$HTTP_RAW_POST_DATA

    下篇:$argc