PHP headers_list() 没有显示全部 headers

PHP headers_list() is not showing all headers

根据文档:http://php.net/manual/en/function.headers-list.php, and this comment: http://php.net/manual/en/function.headers-list.php#110330,php 代码:

<?php var_dump(header_list()); ?>

不显示状态 headers.


这种奇怪的行为很奇怪。所以有两个问题:

  1. 为什么?(我不确定这个问题是否是基于意见的,如果是,并且没有真正的解释请忽略它。我的意思是有时基于意见问题不是基于意见的,而且确实有解释,而且在被问到之前无法预测)。
  2. 我知道我可以使用我自己的函数来设置 header,这将设置 header 并另外记住这个 header 已设置。但这是一种...解决方法,因为 header_list() 非常确定 HERE,FOR THAT。此外,那些 header 位于 php 引擎内存中的某处,因此在脚本中第二次保存它们的内存效率不高。所以... 获得所有 header 的 back-door 是什么,不像下面的解决方法那么愚蠢? 这可能很有用,例如作为调试的一部分/ developer class 将所有 "developer" 数据呈现为页面末尾的 html 评论。 当然,我省略了内容长度 header,这太早无法预测。
  3. 看起来这个函数省略了所有没有冒号的header...对吗?

post 更多代码,header 函数的简单解决方法(线性不是 object,使用全局而不是静态 class 只是为了展示这个想法)。假设 header 函数省略了没有冒号的 headers(这可能不完全正确......):

<?php
    // Mechanism:
    $headers = array();
    function setHeader($header) {
        header($header);
        if (strpos($header, ':') === false) {
            global $headers;
            $headers[] = $header;
        }
    }
    function getHeaders() {
        global $headers;
        return array_merge($headers, header_list());
    }

    // Example:
    setHeader('HTTP/1.1 404 Not Found');
    var_dump(getHeaders());
?>

header_list.

似乎只缺少状态码

您可以使用另一个函数获取当前状态代码(它们可能会相互覆盖):http_response_code.

检查 engine source for headers_list and http_response_code,注意一般 header 的值和状态代码是分开的:

// headers_list
SG(sapi_headers).headers

// http_response_code
SG(sapi_headers).http_response_code

但 HTTP 响应代码并不是唯一具有专用存储的 header:Content-Type does, too:

SG(sapi_headers).mimetype = NULL;

这是怎么回事? complete header() algorithm 专门检查以下字符串以调整状态:

  • HTTP/
  • Content-Type
  • Content-Length
  • Location
  • WWW-Authenticate

HTTP/ 被专门检查,因为这是在 PHP 5.4 之前明确设置状态代码的方式:在那之后,http_response_code is available and is recommended for clarity. That header() was used is confusing, for the reason you're asking in this question and on general principle: the http header BNF 显然不包括状态行:

header-field   = field-name ":" OWS field-value OWS

PHP 单独处理其他的,因为它们是 single-value headers and/or 它们的值对以后计算的效率很重要。

TL;DR: header() 设置的 HTTP/ 不包含在 headers_list() 中,因为 HTTP/ 状态行不在 header 中RFC 意义。但是对于 PHP < 5.4 的限制,即 header() 设置 HTTP/ 状态的唯一方法,它可能从来都不是一个令人困惑的问题.