这段代码:
ob_start();
ob_end_flush();
header('foo');
引发警告
Warning: Cannot modify header information - headers already sent
而这:
echo '';
header('foo');
没有。
我看不出它们之间有任何显着差异。
那么这种行为是否预期?
PS:php 5.3.2
这段代码:
ob_start();
ob_end_flush();
header('foo');
引发警告
Warning: Cannot modify header information - headers already sent
而这:
echo '';
header('foo');
没有。
我看不出它们之间有任何显着差异。
那么这种行为是否预期?
PS:php 5.3.2
我对此的最初反应是“这是我所期望的行为”,但事实证明,您使用的 PHP 版本存在一些微妙之处。
首先让我们解释一下为什么我最初的反应是这样的,因为(鉴于您使用的是 5.3)它确实适用于您的测试:
ob_end_flush()
隐式调用flush()
,将标头推送到浏览器,无论是否生成了任何内容。
echo '';
另一方面,基本上是一个NOOP - 你要求引擎什么都不做,所以什么也没有发生。
然而,更多的调查表明 OB 的implicit_flush
选项实际上是默认关闭的,所以这实际上不应该有任何区别,除非您明确启用了该选项。
此外,在 5.2.2 或 5.4.0+ 之前没有看到这种行为- 所以我的下一个停靠点是将this与this进行比较。即使你根本看不懂 C,很明显 5.3 和 5.4 中的输出处理之间存在巨大差异 - 发生了相当大的重写。
由于现实生活中的承诺,我尚未将其正确拆分并找到此特定问题的相关关键代码,但我会尽快这样做,并在我这样做后扩展此答案。
概括: