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

Sea*_*ean 8 php browser buffer http

我正在尝试熟悉我正在做的项目的PHP的flush()函数,我自己编写了一些脚本,然后将它们上传到我拥有的某个webspace中; 但似乎没有一个工作.我从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 />';
Run Code Online (Sandbox Code Playgroud)

显然脚本STILL无效.

然后我读了一条评论说:

如果你调用ob_flush()和flush()并且仍然没有刷新缓冲区,那可能是因为某些防病毒软件(在这种情况下为Panda)保持缓冲区,直到页面完成加载后再将其发送到浏览器.

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

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

所以我想我真正的问题是:有没有人知道反病毒软件阻止flush()实现它的预期目的(因为我似乎无法在网上找到任何关于它的东西)?如果是这样,有没有办法解决它?

编辑:只是为了清理,我很肯定这不是服务器端,我有一个运行Linux的外部Web服务器,我没有在Linux或Windows机器上本地托管这些脚本.

EDIT2:我在Linux笔记本电脑上的一个朋友家里尝试过这个,我设法让它在我的房子里工作,奇怪的是,刷新代码也没有在他们的房子里工作(相反,它只需要很长时间才能加载,所有出现在曾经)这很奇怪,因为它在我家里的这台笔记本电脑上运行,我不确定路由器是否与flush()函数有关(我真的在网上找不到任何关于这个),因为那是我能想到的唯一可以干扰它的东西.

否则我没有取得任何进展试图自己解决这个问题,这绝对不是与服务器端有关,这很奇怪,因为我似乎发现的大多数信息都是关于服务器是flush()时的问题功能不起作用:/

巧合的是,我也在我家运行Norton(而不是AVG)的PC上尝试过这种方法,但是效果不是很好.

Jon*_*Jon 4

有多种情况可能会阻止立即显示输出,包括:

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

由于flush无法控制此列表中的所有内容,因此实际上无法保证您的程序将按照您的预期运行。

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

刷新 PHP 的写入缓冲区以及 PHP 使用的任何后端(CGI、Web 服务器等)。这试图将当前输出一直推送到浏览器,但有一些警告。

lush() 可能无法覆盖 Web 服务器的缓冲方案,并且它对浏览器中的任何客户端缓冲没有影响。它也不会影响 PHP 的用户空间输出缓冲机制。这意味着如果您正在使用 ob_flush() 和 flash() ,则必须调用它们来刷新 ob 输出缓冲区。

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

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

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

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