【问题标题】:Why doesn't my code raise "Headers already sent" warning?为什么我的代码没有引发“标头已发送”警告?
【发布时间】:2019-10-15 07:51:33
【问题描述】:

我一直认为 PHP 不允许在任何输出后发送标头。我很惊讶地发现这不会导致我的代码出现任何错误:

<?php

echo 'z';
header('X-Foo: Bar');
echo 'y';

它的作用是输出zyX-Foo: Bar 标头就好了。这怎么可能?我没有使用输出缓冲。

服务器是否可以默认启用输出缓冲?或者 PHP 改变了它默认缓冲输出的方式?我正在使用 PHP 7.3.4。是的,我所有的错误、警告和通知都设置为显示。

我正在使用 Homestead 服务器,也许这可以作为一些提示。

【问题讨论】:

  • @DerekPollard 再次阅读问题。 OP知道这一点。 OP 想知道为什么它(显然)在不应该的时候工作
  • 它在我的版本 7.3.3 上发送错误
  • 它也应该在你的版本上重新运行Warning。见3v4l.org/EGrXp
  • 我会看php.net/manual/en/outcontrol.configuration.php。可以在php.ini 级别打开输出缓冲。 OP 提到 Homestead - 这个代码在 Laravel 中吗?
  • 对我也很好,但添加了 flush();在回声'z'之后;我收到“标头已发送”错误。因此,出于某种原因(可能是服务器配置),echo 不会直接发送到输出。

标签: php php-7 php-7.3


【解决方案1】:

这意味着在您的 php 配置中启用了指令 output_buffering

该值可以是 Off0(顺便说一句,默认情况下禁用),也可以是 On 或任何大于 0 的整数值,这意味着缓冲限制(以字节为单位)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    相关资源
    最近更新 更多