PHP headers_list()未显示所有标题

根据文档:http://php.net/manual/en/function.headers-list.php,此注释:http://php.net/manual/en/function.headers-list.php#110330,PHP代码

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

不显示状态标题.

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

>为什么呢? (我不确定这个问题是否是基于观点的,如果没有,请省略它.我的意思是有时基于观点的问题不是基于观点的,确实有解释,而这是无法预测的在被问到之前).
>我知道我可以使用自己的函数来设置标头,该标头将设置标头,并且还要记住已设置了此标头.但这是一种…解决方法,因为header_list()可以肯定在这里.此外,这些标头位于PHP引擎内存中的某个位置,因此第二次将其保存在脚本中对内存效率不高.那么…获取所有标头的后门是什么,而不像下面的变通方法那样愚蠢?例如,这对于作为debug / developer类的一部分很有用,该类在页面末尾将所有“ developer”数据呈现为html注释.当然,我省略了内容长度标头,但这还为时过早.
>似乎此函数忽略了所有没有冒号的标题…对吗?

要发布更多代码,可以使用简单的变通方法来实现标头函数(线性的不是对象,使用全局变量而不是静态类只是为了说明这一点).假设标头函数将省略不带冒号的标头(这可能不是很正确…):

<?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());
?>

解决方法:

检查engine source for headers_list and http_response_code,请注意,常规标头和状态代码的值是分开的:

// headers_list
SG(sapi_headers).headers

// http_response_code
SG(sapi_headers).http_response_code

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

SG(sapi_headers).mimetype = NULL;

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

> HTTP /
>内容类型
>内容长度
>位置
>万维网认证

专门检查HTTP /是因为这是在PHP 5.4之前显式设置状态代码的方式:此后,为了便于阅读,建议使用http_response_code.所使用的header()令人困惑,因为您在这个问题中询问的原因和一般原则是:http header BNF显然不包括状态行:

06002

PHP分别处理其他值,因为它们是单值标头和/或它们的值对于以后的计算效率至关重要.

TL; DR:headers_list()中不包含header()设置的HTTP /,因为从严格的RFC角度来看,HTTP /状态行不是标题.但是对于PHP< 5.4局限性在于header()是设置HTTP /状态的唯一方法,它可能从来就不是一个令人困惑的问题.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...