【问题标题】:headers_sent() return false, but headers were sentheaders_sent() 返回 false,但标头已发送
【发布时间】:2013-07-11 08:27:17
【问题描述】:

我的代码很简单:

<!DOCTYPE html>
<html>
  <head>
    ...

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

它返回假。打印某些内容后不应该立即发送标题吗?就像在第一个 &lt; 字符之后一样。

【问题讨论】:

  • 如果你的输出缓冲则不行。

标签: php html http-headers


【解决方案1】:

这取决于您的 output_buffering 指令是否在 php.ini 文件中。如果是Off

output_buffering = Off

那么echo headers_sent()应该输出1

在其他情况下,headers_sent() 不会输出任何结果,因为它将为 FALSE。由于输出已缓冲,因此不会发送标头。

如果您想绕过这个并强制发送标头,您可以使用flush()

希望这会有所帮助!

【讨论】:

  • ok ini_get('output_buffering') 显示 4096。但我在 php.ini 中找不到该设置,并且 ini_set 似乎不适用于此选项
  • 在 php.ini 中添加了 output_buffering = Off 并重新启动,现在它可以工作了:D
【解决方案2】:

阅读文档中的 cmets!

这里例如:http://es1.php.net/manual/en/function.headers-sent.php#75835

他做了一个很棒的说明:P

编辑

是的, headers_sent() 将返回 false,即使您使用 print() 或 header() 将某些内容发送到 ouptut,如果 output_buffering 与您 php.ini 中的 Off 不同,并且您发送的内容的长度不超过 output_buffering 的大小. [...] 这在 php.ini 评论中注意到: “即使在发送正文内容之后,输出缓冲也允许您发送标题行(包括 cookie),但代价是稍微降低了 PHP 的输出层。”

【讨论】:

    【解决方案3】:

    我设法找到了一种不停用 output_buffering 的方法:

    if (!headers_sent() && !ob_get_contents()) {
        // do your thing
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-17
      • 2023-03-27
      • 2014-09-06
      • 2012-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多