编程语言
首页 > 编程语言> > php是否故意认为ob_end_flush()调用之后有一些输出?

php是否故意认为ob_end_flush()调用之后有一些输出?

作者:互联网

这段代码:

ob_start();
ob_end_flush();

header('foo');

引发警告

Warning: Cannot modify header information - headers already sent

而这:

echo '';
header('foo');

没有.

我看不出它们之间有什么显着差异.

那么,这种行为是否正常?

PS:PHP 5.3.2

解决方法:

My initial reaction到此是“这就是我期望的行为”,但是turns out在您所使用的PHP版本上有一些细微之处.

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

ob_end_flush()隐式调用flush(),将标头推入浏览器,而不管是否已生成任何内容.
回声”;另一方面,基本上是NOOP-您要求引擎什么也不做,所以什么也没发生.

但是,进一步的调查表明,默认情况下,OB的implicit_flush option实际上是关闭的,因此,除非您明确启用了此选项,否则这实际上不会有任何区别.

此外,这种行为在5.2.2之前或从5.4.0版本开始就没有出现-因此,我的下一个调用端口是将thisthis进行比较.即使您根本看不懂C,也应该很明显地看到其中有一个5.3和5.4中输出处理之间的巨大差异-发生了相当大的重写.

由于现实生活中的承诺,我尚未将其正确分解并找到针对此特定问题的相关关键代码,但是我会尽快进行处理,并在完成后扩展此答案.

摘要:

>根据您的PHP版本和配置,这很可能是合乎逻辑的和预期的行为.
> PHP版本之间的重大差异使此问题不仅仅是一个简单的答案

标签:output-buffering,php
来源: https://codeday.me/bug/20191123/2067001.html