Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP缓冲区ob_flush()与flush()的比较_Php_Flush_Output Buffering - Fatal编程技术网

PHP缓冲区ob_flush()与flush()的比较

PHP缓冲区ob_flush()与flush()的比较,php,flush,output-buffering,Php,Flush,Output Buffering,ob\u flush()和flush()之间有什么区别?为什么我必须同时调用这两个函数 报告说: 此函数将发送输出缓冲区的内容(如果有) 报告说: 刷新PHP的写缓冲区以及PHP使用的任何后端(CGI、web服务器等) 然而,它继续说: [it]可能无法覆盖web服务器的缓冲方案 所以,在我看来,我可以一直使用ob\u flush()。然而,当我这样做的时候,我得到了奇怪的结果。有人能简单地解释一下这里发生了什么吗?ob\u flush发送应用程序启动的缓冲区。任何PHP脚本中都可能有多个嵌套的

ob\u flush()
flush()
之间有什么区别?为什么我必须同时调用这两个函数

报告说:

此函数将发送输出缓冲区的内容(如果有)

报告说:

刷新PHP的写缓冲区以及PHP使用的任何后端(CGI、web服务器等)

然而,它继续说:

[it]可能无法覆盖web服务器的缓冲方案


所以,在我看来,我可以一直使用
ob\u flush()
。然而,当我这样做的时候,我得到了奇怪的结果。有人能简单地解释一下这里发生了什么吗?

ob\u flush
发送应用程序启动的缓冲区。任何PHP脚本中都可能有多个嵌套的
ob_start()
ob_flush
将当前内容传递到上层

PHP本身可能(自行决定)缓冲区输出。这取决于后端。但是通常,
FastCGI
本身有一个套接字缓冲区。因此,还需要调用
flush()
,以将当前内容发送到web服务器

现在,web服务器本身可能会实现另一种缓冲方案(
mod_deflate
或内容过滤器),您对此没有任何影响。但这很少,因为它需要专门配置


无论如何,两者都要使用。

ob\u flush发送应用程序启动的缓冲区。任何PHP脚本中都可能有多个嵌套的
ob_start()
ob_flush
将当前内容传递到上层

PHP本身可能(自行决定)缓冲区输出。这取决于后端。但是通常,
FastCGI
本身有一个套接字缓冲区。因此,还需要调用
flush()
,以将当前内容发送到web服务器

现在,web服务器本身可能会实现另一种缓冲方案(
mod_deflate
或内容过滤器),您对此没有任何影响。但这很少,因为它需要专门配置


无论如何,两者都要使用。

ob\u flush
刷新您使用类似
ob\u start
的函数创建的输出缓冲区


flush
将PHP脚本本身的缓冲输出刷新到其调用方

ob\u flush
刷新您使用类似于
ob\u start的函数创建的输出缓冲区


flush
将PHP脚本本身的缓冲输出刷新到调用方

我想这与您的。使用输出缓冲的显著优势在于它与数据压缩一起使用。如果您不使用ob\u gzhandler,那么没有什么好处
flush
单独提交服务器上仍然存在的任何输出数据。使用
ob\u start
及其对应的
ob\u flush
ob\u end\u clean
ob\u end\u flush
,任何等待压缩的内容(将
flush
ob_flush
视为不同的存储桶-
ob
将数据发送到
flush
flush
将数据发送到浏览器-可能不准确,但这正是想法)将被打包并发送到客户端。

我想这与您的有关。使用输出缓冲的显著优势在于它与数据压缩一起使用。如果您不使用
ob\u gzhandler
,则几乎没有什么好处。
flush
单独提交服务器上仍然存在的任何输出数据。使用
ob\u start
及其对应的
ob\u flush
ob\u end\u clean
ob\u end\u flush
,任何等待压缩的内容(将
flush
ob\u flush
视为不同的存储桶-
ob
将数据发送到
flush
flush
将数据发送到浏览器-可能不准确,但这是想法)将被打包并发送到客户端。

ob flush()
是高级刷新。它刷新高级缓冲区,并将所有内容放入准备发送的低级内部缓冲区

  • 请注意,
    ob\u
    函数族会创建缓冲区堆栈,因此如果编写代码是为了利用这种堆栈,那么盲目地到处写入
    ob\u flush()
    确实会给您带来“奇怪的结果”
flush()
是一种低级刷新,指示PHP刷新其内部低级数据缓冲区

下面是套接字层缓冲区;下面是网络层缓冲区。在最低级别,是沿着数据电缆的电子队列。

ob\u flush()
是高级刷新。它刷新高级缓冲区,并将所有内容放在低级内部缓冲区中,以便发送

  • 请注意,
    ob\u
    函数族会创建缓冲区堆栈,因此如果编写代码是为了利用这种堆栈,那么盲目地到处写入
    ob\u flush()
    确实会给您带来“奇怪的结果”
flush()
是一种低级刷新,指示PHP刷新其内部低级数据缓冲区


下面是套接字层缓冲区;下面是网络层缓冲区。在最底层,是沿着数据电缆的电子队列。

谢谢,bucket类比是一个很好的例子。谢谢,bucket类比是一个很好的例子。使用ob_flush和flush,并按顺序使用。重要的细节丢失了这个答案是配置选项,它在php.ini的生产版本中的默认值是4096。这意味着当任何php脚本启动时,输出的前4096字节都会得到缓冲(在可使用
ob_flush()
刷新的缓冲区中)。这就是为什么需要使用
ob_flush()
以及
flush()的原因
。通过php.ini禁用
输出缓冲
或调用
ob\u end\u clean()