什么之间的区别ob_flush()
,并flush()
和我为什么一定要同时调用?
该ob_flush()
参考说:
此函数将发送输出缓冲区的内容(如果有)。
该flush()
参考说:
刷新PHP的写缓冲区以及PHP使用的任何后端PHP(CGI,Web服务器等)。
但是,它继续说:
[它]可能无法覆盖Web服务器的缓冲方案…
因此,在我看来,我可以一直使用ob_flush()
所有时间。但是,这样做会得到奇怪的结果。有人可以简单地解释一下这是怎么回事吗?
什么之间的区别ob_flush()
,并flush()
和我为什么一定要同时调用?
该ob_flush()
参考说:
此函数将发送输出缓冲区的内容(如果有)。
该flush()
参考说:
刷新PHP的写缓冲区以及PHP使用的任何后端PHP(CGI,Web服务器等)。
但是,它继续说:
[它]可能无法覆盖Web服务器的缓冲方案…
因此,在我看来,我可以一直使用ob_flush()
所有时间。但是,这样做会得到奇怪的结果。有人可以简单地解释一下这是怎么回事吗?
Answers:
ob_flush
发送应用程序启动的缓冲区。ob_start()
任何PHP脚本中都可能有多个嵌套的。ob_flush
将当前内容传递到上层。
PHP本身(可以自行决定)可以缓冲输出。这取决于后端。但是通常FastCGI
有一个套接字缓冲区。因此,还flush()
需要调用以将当前内容发送到Web服务器。
现在,Web服务器本身可能实现了另一个缓冲方案(mod_deflate
或内容过滤器),您对此没有影响。但这很少,因为它需要专门配置。
无论如何,请同时使用两者。
output_buffering
配置选项,其在生产版本的php.ini中的默认值为4096。这意味着当任何PHP脚本启动时,输出的前4096个字节将被缓冲(在可刷新的缓冲区中ob_flush()
)。这就是为什么必须使用ob_flush()
和的原因flush()
。output_buffering
通过php.ini禁用ob_end_clean()
或ob_end_flush()
在脚本开始处调用或可以消除此必要。
ob_end_clean()
在“脚本开始”时似乎违反直觉。您的意思是我们应该ob_start()
在两次冲洗之后和之前将其包括在内吗?
ob_start()
和一个ob_end_clean()
。然后,在脚本执行过程中出现任何“回声”之后,我还将包括ob_flush(); flush();
,并且我希望在脚本花费时间的同时,到目前为止所做的任何事情都会在屏幕上(在浏览器中)输出。但是直到最后都没有解决。我想念什么?
ob_flush()
是高级冲洗。它刷新高级缓冲区,并将所有内容放入准备发送的低级内部缓冲区中。
ob_
函数家族会创建缓冲区堆栈,因此,ob_flush()
如果编写代码来利用此堆栈,那么盲目地在所有地方编写确实会给您“奇怪的结果”。flush()
是低级刷新,指示PHP刷新其内部低级数据缓冲区。
在此之下,仍将有套接字层缓冲区。在此之下,有网络层缓冲区。而且,在最低层次上,电子队列沿着数据电缆传输。
ob_start()
和一个ob_end_clean()
。然后,在脚本执行过程中出现任何“回声”之后,我还将包括ob_flush(); flush();
,并且我希望在脚本花费时间的同时,到目前为止所做的任何事情都会在屏幕上(在浏览器中)输出。但是直到最后都没有解决。我想念什么?