【发布时间】:2015-07-22 06:23:20
【问题描述】:
根据文档: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() 非常确定 HERE, FOR THAT。此外,这些标头位于 php 引擎内存中的某个位置,因此在脚本中第二次保存它们并不是内存效率。所以... 什么是获取所有标头的后门,不像下面的解决方法那么愚蠢? 这可能很有用,例如作为调试/开发人员类的一部分,它呈现所有“开发人员” " 数据作为页面末尾的 html cmets。 当然,我忽略了内容长度标题,因为它太早预测了。
- 好像这个函数省略了所有没有冒号的标题...是不是?
要发布更多代码,头函数的简单解决方法(线性不是对象,使用全局而不是静态类只是为了展示这个想法)。假设标头函数省略了不带冒号的标头(这可能不太正确...):
<?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());
?>
【问题讨论】:
-
在尝试发送任何内容之前,我看不到该函数应该如何了解 http 状态。一般来说,我希望该函数列出由 php.ini 准备的所有标头。由于http协议本身不是由php处理,而是由底层http服务器处理,php应该如何知道呢?我同意这可能不方便。但我没有看到对此的技术解决方案。
-
是的,但是当你设置 header('HTTP/1.1 404 Not Found');很明显,状态码将是 404 ......?如果你用 403 覆盖它,它将是 403 ......?我的意思是您是直接使用标头设置状态,那么为什么此标头不在列表中?更重要的是,当您设置编码或其他内容时,它在列表中......只有状态标题和非冒号标题不在列表中:(.
-
我会假设这样的标头 not 出于完全相同的原因直接在 php 中排队。最终的http状态只能由http服务器设置。所以可能标题的处理方式不同。该函数列出的标头在 php 中排队,请求协议相关的标头可能以某种方式在 http 服务器和 php 之间的进程间通信中发出信号。就像一个“返回值”。
-
好的,我明白了。随时发布有关该问题的更多信息、资源或文档的答案,我当然会接受。感谢您的帮助:)。
-
不,谢谢:我只是在这里表达我的判断。这不是我所知道的。所以这不是一个答案。 ;-)