3

这段代码:

ob_start();
ob_end_flush();

header('foo');

引发警告

Warning: Cannot modify header information - headers already sent

而这:

echo '';
header('foo');

没有。

我看不出它们之间有任何显着差异。

那么这种行为是否预期?

PS:php 5.3.2

4

1 回答 1

3

我对此的最初反应是“这是我所期望的行为”,但事实证明,您使用的 PHP 版本存在一些微妙之处。

首先让我们解释一下为什么我最初的反应是这样的,因为(鉴于您使用的是 5.3)它确实适用于您的测试:

ob_end_flush()隐式调用flush(),将标头推送到浏览器,无论是否生成了任何内容。
echo '';另一方面,基本上是一个NOOP - 你要求引擎什么都不做,所以什么也没有发生。

然而,更多的调查表明 OB 的implicit_flush选项实际上是默认关闭的,所以这实际上不应该有任何区别,除非您明确启用了该选项。

此外,在 5.2.2 或 5.4.0+ 之前没有看到这种行为- 所以我的下一个停靠点是将thisthis进行比较。即使你根本看不懂 C,很明显 5.3 和 5.4 中的输出处理之间存在巨大差异 - 发生了相当大的重写。

由于现实生活中的承诺,我尚未将其正确拆分并找到此特定问题的相关关键代码,但我会尽快这样做,并在我这样做后扩展此答案。


概括:

  • 根据您的 PHP 版本和配置,这很可能是合乎逻辑和预期的行为。
  • PHP 版本的巨大差异使这个问题不仅仅是一个简单的答案
于 2013-05-01T08:45:54.973 回答