PHP flush()显然可以在我的Linux机器上运行,但不能在我的windows机器上运行


PHP flush() apparently works on my Linux machine but not on my windows machine?

我正在为我正在做的一个项目熟悉PHP的flush()函数,我自己写了一些脚本,并将它们上传到我自己的一些网站空间;但它们似乎都不起作用。我从PHP.net上的一条评论中找到了下面的一条,并尝试了一下:

<?php
header( 'Content-type: text/html; charset=utf-8' );
echo 'Begin ...<br />';
for( $i = 0 ; $i < 10 ; $i++ )
{
    echo $i . '<br />';
    flush();
    sleep(1);
}
echo 'End ...<br />';

显然剧本还是没用。

然后我读到一条评论说:

如果您调用ob_flush()和flush(),但仍然没有刷新缓冲区,这可能是因为某些防病毒软件(在本例中为Panda)会保留缓冲区,直到页面加载完成后再将其发送到浏览器。

所以我决定在我使用Linux(Ubuntu 12.04)的机器上请求该网页,因为它没有安装任何防病毒软件;而且效果很好!

我不知道这是否与反病毒软件有关?或者Windows中其他一些奇怪的机制阻止flush()实现其预期目的,我在两台机器上使用相同的浏览器(Firefox 14.0.1),所以我怀疑这可能是真的。

所以我想我真正的问题是:有人知道防病毒软件阻止flush()达到预期目的吗(因为我似乎在网上找不到任何关于它的信息)?如果是这样的话,有什么办法绕过它吗?

编辑:澄清一下,我确信这不是服务器端,我有一个运行Linux的外部网络服务器,我没有在Linux或Windows机器上本地托管这些脚本。

第二版:我在朋友家的Linux笔记本电脑上试过这个,我设法让它在家里运行,奇怪的是,flush代码在他们家也不起作用(相反,它只是花了很长时间加载,然后一次全部出来),这很奇怪,因为它在我家的这台笔记本电脑上运行,我不确定路由器是否与flush()函数的工作有关(我真的在网上找不到任何关于这方面的信息),因为这是我唯一能想到的可能干扰它的东西。

否则,我在尝试独自解决这个问题时没有取得任何进展,这肯定与服务器端无关,这很奇怪,因为我发现的大多数信息都是关于当flush()函数不起作用时服务器是问题所在:/

巧合的是,我也在家里运行Norton(而不是AVG)的电脑上尝试过,它很有效,但不是100%。

有几种东西可以阻止输出立即显示,包括:

  • 从PHP中缓冲(这是flush所防止的)
  • 缓冲以积累足够的数据进行压缩(启用压缩时)
  • 在web服务器上缓冲(无论出于何种原因,它都可能决定这样做)
  • 浏览器内部的缓冲(浏览器使用各种技术,以便最终用户"感觉很快"加载页面;这些技术包括不总是在内容可用时立即显示内容)

由于flush不能控制这个列表中的所有内容,因此不能保证你的程序会按照你的期望运行

所有这些都在flush:的注释中提到

刷新PHP的写缓冲区以及PHP使用的任何后端(CGI、web服务器等)。这试图将电流输出推至浏览器的方式,并附带一些注意事项。

flush()可能无法覆盖web服务器的缓冲方案,并且它对浏览器它也不会影响PHP的用户空间输出缓冲机械装置这意味着您必须同时调用ob_flush()和flush()来刷新ob输出缓冲区(如果您正在使用这些缓冲区)。

一些服务器,尤其是Win32上的服务器,仍然会缓冲脚本的输出,直到它在传输结果之前终止到浏览器。

像mod_gzip这样的Apache服务器模块可能会自己进行缓冲,这将导致flush()无法发送数据立即发送给客户。

甚至浏览器也可能在显示输入之前对其进行缓冲。例如,Netscape会缓冲文本,直到收到行尾或标记的开头,并且直到可以看到最外面表格的标签。

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