2011-04-18 84 views
2

在控制台中运行PHP脚本时,该脚本的所有标准输出文本都会在脚本运行时显示在控制台窗口中。浏览器窗口是否可以在运行冗长的PHP脚本的同时在浏览器中接收状态报告,而不是在脚本结尾处获取所有输出结果?Web服务器是否可以使用扩展的输出时间流来响应HTTP请求?

+0

当然,只要脚本关闭输出缓冲,然后定期输出状态消息。只要服务器不重写缓冲区刷新请求,就会在客户端看到这些消息。但是......至多缓冲区刷新/覆盖只是对服务器和底层操作系统的建议,即缓冲区应该被刷新。 – 2011-04-18 22:12:23

回答

4

是的。只需定期调用flush()和ob_flush()。至少每120秒输出一次输出以保持与浏览器的连接至关重要。

一个粗略的例子:

while(!$done) { 
     //doWork(); 
     echo number_format(100 * ($workDone/$workTotal)) . "% "; 
     flush(); 
     ob_flush(); 
    } 

编辑:下面是我的ENV工作理念的一个任意证明:

print('hello'); 
print(str_repeat(".\n", 2048)); 
flush(); 
//this might be a safe way to only flush the buffer if necessary? 
if(ob_get_length()) 
    ob_flush(); 
sleep(60); 
+0

没有工作。在[this](http://pastebin.com/LzeTUnzi)代码中,我在加载开始之前调用[this](http://pastebin.com/27qkdkYD)函数,因此用户不应该尽快看到此文本浏览器加载地址? – Hubro 2011-04-18 22:38:35

+0

奇怪的是,我尝试了一些简单的例子,看起来Google Chrome只在收到至少一个换行符后才开始显示输出(flush()的手册页也提到了一些浏览器在显示之前至少需要256字节的数据)。在flush之前尝试添加一个换行符(也许是一些填充)。 – 2011-04-18 22:49:02

+0

我想说Chrome也有256字节的要求。输出任何东西的唯一情况是,当我收到有关'ob_flush'没有做任何事情的冗长警告时。 – Hubro 2011-04-18 22:55:57

0

是的,有一件事你不用担心,如果你有特别长的执行时间超时。这可能发生为PHP超时或浏览器超时(通常大约2分钟)。

这个关于connection handling的PHP文档有很多关于保持连接活着的好消息。

相关问题