两者之间有什么区别ob_flush()
,flush()
为什么我必须同时调用两者?
此函数将发送输出缓冲区的内容(如果有)。
刷新 PHP 的写入缓冲区以及 PHP 正在使用的任何后端(CGI、Web 服务器等)。
然而,它继续说:
[它] 可能无法覆盖您的 Web 服务器的缓冲方案……</p>
所以,在我看来,我可以一直使用ob_flush()
。但是,当我这样做时,我会得到奇怪的结果。有人可以简单地解释一下这里发生了什么吗?
两者之间有什么区别ob_flush()
,flush()
为什么我必须同时调用两者?
此函数将发送输出缓冲区的内容(如果有)。
刷新 PHP 的写入缓冲区以及 PHP 正在使用的任何后端(CGI、Web 服务器等)。
然而,它继续说:
[它] 可能无法覆盖您的 Web 服务器的缓冲方案……</p>
所以,在我看来,我可以一直使用ob_flush()
。但是,当我这样做时,我会得到奇怪的结果。有人可以简单地解释一下这里发生了什么吗?
ob_flush
发送一个应用程序启动的缓冲区。任何 PHP 脚本中都可能有多个嵌套ob_start()
的 's。ob_flush
将当前内容传递给上层。
PHP 本身可能(自行决定)缓冲输出。这取决于后端。但通常FastCGI
它自己有一个套接字缓冲区。因此flush()
也需要调用以将当前内容发送到 Web 服务器。
现在,Web 服务器本身可能会实现另一个缓冲方案(mod_deflate
或内容过滤器),您对此没有任何影响。但这很少见,因为它需要专门配置。
无论如何,两者都用。
ob_flush
刷新您使用类似函数创建的输出缓冲区ob_start
flush
将 PHP 脚本本身的缓冲输出刷新到其调用者
ob_flush()
是高级同花顺。它刷新高级缓冲区并将所有内容放入准备发送的低级内部缓冲区。
ob_
函数系列会创建缓冲区堆栈ob_flush()
,因此如果编写代码是为了利用这种堆栈,那么盲目地到处写确实会给您带来“奇怪的结果”。flush()
是一个低级刷新,指示 PHP 刷新其内部的低级数据缓冲区。
在此之下,还会有套接字层缓冲区;在此之下,有网络层缓冲区。而且,在最低级别,电子队列沿着数据电缆向下移动。
我想这与你之前的问题有关。使用输出缓冲的显着优势在于它与数据压缩一起使用。如果您不使用ob_gzhandler
,则几乎没有什么收获。flush
单独将提交仍然在服务器上的任何输出数据。Withob_start
和它的对应物ob_flush
, ob_end_clean
and ob_end_flush
, 任何等待被压缩的东西(看flush
和ob_flush
指代不同的桶 -ob
将数据发送到flush
,flush
将数据发送到浏览器 - 可能不准确,但这就是想法)将被打包并发送给客户端.