我试图运行一个循环每秒25秒基本。
for($i = 0; $i <= 25; $i += 1){
echo $i;
sleep(1)
}
问题是它不输出,直到它完全完成,所以后继续循环25次。 有没有办法做到这一点,因此将每睡前输出? 而不是等到全部循环是否已经完成?
谢谢!
我试图运行一个循环每秒25秒基本。
for($i = 0; $i <= 25; $i += 1){
echo $i;
sleep(1)
}
问题是它不输出,直到它完全完成,所以后继续循环25次。 有没有办法做到这一点,因此将每睡前输出? 而不是等到全部循环是否已经完成?
谢谢!
什么你想要实现增量输出从PHP浏览器。
无论这是可以实现的可能取决于你的服务器,以及如何你调用PHP上。
PHP的FastCGI下
你可能多一点可能当PHP 的FastCGI下,而不是作为Apache模块运行碰上这样那样的问题,因为服务器和PHP程序之间的耦合不是紧密耦合。 FastCGI的通信使用输出缓冲一旦数据已经离开PHP进程,与发送到浏览器的输出仅当请求是充分完整的,或该缓冲器已经充满。 在此之上,PHP的过程往往在一定时间后终止,避免让任何一个运行时间过长。
这就是说,一个组合ob_end_flush()
(或ob_flush()
和flush()
应该仍然导致PHP请求下游缓冲器被清空,所以这可能仍然工作。 您可能还需要调查是否需要长度PHP脚本的时间限制。
下mod_php的PHP
如果您使用mod_php的,你可以逐步写出到浏览器中。 使用flush()命令,以确保PHP模块将立即冲洗掉。 如果没有输出缓冲,或者一些Apache模块,如mod_gzip的,那么就应该马上出去给用户的浏览器。 更重要的是,你可以保持你的PHP脚本,只要你愿意(在PHP set_time_limit()函数)运行,在默认配置,但当然这会消耗一些内存。
您可能会在一些浏览器,直到页面的一定量的下载不开始渲染页面遇到麻烦。 IE浏览器的某些版本可以等待1KB。 我发现,Chrome浏览器可以等待更多。 很多人解决这个获得通过添加填充,如长注释1或2 KB长在文档的顶部。
呼叫flush
将迫使PHP继续之前的所有输出缓冲到客户端。
for($i = 0; $i <= 25; $i += 1){
echo $i;
flush();
sleep(1);
}
编辑:
测试这个我的lighttpd服务器上后,我注意到,它的缓冲输出,我在4096个字符块,我认为其他浏览器可能也有类似的缓冲方案。 也可以GZIP防止flush
彻底。 不幸的是没有办法测试它的工作,由于HTTP的性质。
另外随着这一战略的另一个问题是它离开该PHP PROC阻止其他请求。 这可能会导致请求堆积。
我只是通过这个同样的问题散列从初学者的角度和与此裸机脚本,将做你想做的走了过来。
<?PHP
ob_start();
$buffer = str_repeat(" ", 4096)."\r\n<span></span>\r\n";
for ($i=0; $i<25; $i++) {
echo $buffer.$i;
ob_flush();
flush();
sleep(1);
}
ob_end_flush();
?>
你可能会问可能是问题, 在这里 (约\r\n
)和这里 (约ob_flush()
希望可以帮助你。