2012-08-05 60 views
8

我试图熟悉PHP的flush()函数,我正在做一个项目,我自己写了几个脚本,并将它们上传到我自己的一些webspace;但似乎没有一个人工作。我从PHP.net评论拿起一个下方,试了一下:PHP flush()显然适用于我的Linux机器,但不适用于我的Windows机器?

<?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机器上本地托管这些脚本。编辑2:我在Linux笔记本电脑上的一个朋友家中尝试过这种方法,我设法让它在我的房子里工作,奇怪的是,同花顺的代码也没有在他们家工作(相反,它只花了很长时间来加载和所有这一切都出来了)这是奇怪的,因为它在我家里的这台笔记本电脑上工作,我不确定路由器是否与flush()函数有关(我真的无法在网络上找到任何有关),因为那是我能想到的唯一可能会干扰它的事情。

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

巧合的是,我也试过在运行诺顿(而不是AVG)的PC上运行它,但它的工作原理并不完全是100%。

回答

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个字节后显示的页面,所以你 可能需要冲洗让那些 浏览器显示页面之前发送额外的空格。

+0

我知道这绝对是客户端,而不是服务器端,虽然在Linux中的Firefox中呈现相同的页面,但在Windows下不好。这导致我认为这也不是浏览器相关的问题。 。 。这似乎消除了该报价中的所有解释:/ – Sean 2012-08-05 13:41:39

+0

@SeanDunwoody:你怎么知道它不是服务器端?服务器是每个操作系统下的不同程序。浏览器也一样。 – Jon 2012-08-05 13:45:04

+0

不,对不起,我认为你误解了,我有一台服务器托管这个正在运行的Linux,我不在任何一台机器上本地托管这个 – Sean 2012-08-05 13:46:00

相关问题