PHP的输出与睡眠()PHP的输出与睡眠()(php output with sleep())

2019-05-12 03:37发布

我试图运行一个循环每秒25秒基本。

for($i = 0; $i <= 25; $i += 1){ 
    echo $i;
    sleep(1)
}

问题是它不输出,直到它完全完成,所以后继续循环25次。 有没有办法做到这一点,因此将每睡前输出? 而不是等到全部循环是否已经完成?

谢谢!

Answer 1:

什么你想要实现增量输出从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长在文档的顶部。



Answer 2:

呼叫flush将迫使PHP继续之前的所有输出缓冲到客户端。

for($i = 0; $i <= 25; $i += 1){ 
    echo $i;
    flush();
    sleep(1);
}

编辑:

测试这个我的lighttpd服务器上后,我注意到,它的缓冲输出,我在4096个字符块,我认为其他浏览器可能也有类似的缓冲方案。 也可以GZIP防止flush彻底。 不幸的是没有办法测试它的工作,由于HTTP的性质。

另外随着这一战略的另一个问题是它离开该PHP PROC阻止其他请求。 这可能会导致请求堆积。



Answer 3:

我只是通过这个同样的问题散列从初学者的角度和与此裸机脚本,将做你想做的走了过来。

<?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() 希望可以帮助你。



文章来源: php output with sleep()
标签: php sleep php4