8

我正在尝试熟悉我正在做的一个项目的 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 的外部 Web 服务器,我没有在 Linux 或 Windows 机器上本地托管这些脚本。

EDIT2:我在 Linux 笔记本电脑上的一个朋友家中尝试了这个,我设法让它在我家工作,奇怪的是刷新代码在他们家也没有工作(相反,它只需要很长时间才能加载并且所有都出来了一次)这很奇怪,因为它可以在我家的这台笔记本电脑上运行,我不确定路由器是否与 flush() 函数的工作有关(我真的在网上找不到任何关于此的内容),因为那是我唯一能想到的可能会干扰它。

否则我试图自己解决这个问题没有任何进展,这绝对与服务器端无关,这很奇怪,因为我似乎找到的大多数信息都在谈论服务器是 flush() 时的问题功能不工作:/

巧合的是,我也在我家的一台运行 Norton(而不是 AVG)的 PC 上尝试了这个,它可以工作,但不是 100%。

4

1 回答 1

4

有几件事会阻止输出立即显示,包括:

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

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

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

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

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

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

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

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

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

于 2012-08-05T13:36:05.027 回答