PHP在Apache / Linux上输出缓冲区刷新问题

我遇到了Linux输出缓冲区在我的Linux Web服务器上刷新的问题。 输出缓冲区保持正确,所有正确的数据被推送到我的代码中,但通常的冲洗机制不会刷新到浏览器。 我已经尝试一切张贴在这里: http : //php.net/manual/en/function.flush.php但迄今没有成功。

我从php.net得到一个小脚本来testing它:

<?php ob_start(); for($i=0;$i<70;$i++) { echo 'printing...<br />'; ob_get_flush(); flush(); usleep(300000); } ?> 

这应该打印“打印…”70次,每三秒一行。 这对我的另一个基于Windows的testing环境(仍然使用apache,XAMPP包)工作得很好,但在我的Linux服务器上却没有。 在给浏览器提供任何东西之前,它等待脚本完成,基本上忽略了整个刷新命令。

如果任何人以前经历过这个,或者知道任何可以帮助的东西(无论是服务器configuration还是调整代码),都将不胜感激!

我有这个问题,发现线路:

 while ( @ob_end_flush() ); // even if there is no nested output buffer flush(); 

会解决问题。

结果可能不同。 这在我的系统上使用IE和Apache 2.0.55。

杰夫

刷新PHP的输出缓冲区和刷新Apache的缓冲区是两个不同的任务。 经常发生的情况是,您需要刷新PHP的输出缓冲区,但是直到有更多的数据时,Apache才会向浏览器发送任何内容。 而且,有时浏览器在收到足够的数据之前不会显示任何内容。 你可以尝试的是用换行符“填充”你的输出。

您发布的代码还有其他两个问题。 首先,它开始输出缓冲一次,然后在循环中多次结束。 你也可以在循环内部输出缓冲,或者你可以简单地忽略它。 另一个问题是, ob_get_flush()将以string的forms返回输出缓冲区的内容,而不是回显它。

试试这个代码:

 <?php for($i=0;$i<70;$i++) { echo 'printing...<br />'; echo str_repeat("\n",1024); flush(); usleep(300000); } ?> 

从PHP手册:

flush()可能无法覆盖您的Web服务器的缓冲scheme,并且对浏览器中的任何客户端缓冲都没有影响。 […]

Apache的服务器模块(如mod_gzip)可能会自己做缓冲,这将导致flush()不会立即将数据发送到客户端。

甚至浏览器在显示之前可能会缓冲它的input。 例如,Netscape会caching文本,直到收到行尾或标签的开始,直到看到最外面的表的标签才会显示表格。

某些版本的Microsoft Internet Explorer只有在收到256字节的输出后才会开始显示页面,因此您可能需要在刷新之前发送额外的空格以使浏览器显示页面。

我的例子试图通过发送1024个换行符来解决这个问题。

正如在PHP文档中所指出的,在我的经验中,这是一个常见的原因是由Apache上的mod_gzip输出缓冲。 现在许多发行版都默认启用了这个function。

标记