如何让PHP程序实现后台工作
set_time_limit(0);
例如下面这个程序:
for($i=0;$i<10;$i++){
echo $i;
sleep(1);
}
我需要它每秒输出一次,而不是10秒完成后再一起输出1到10。
实际情况:
我有一个PHP文件,它一次需要运行两个小时,就是for,foreach,while这种正常的循环。
现在的问题就是页面要运行完了之后才输出结果,这两个小时之内,页面不能关,不能刷新。我都看不到程序的进行情况,比如现在循环到几了,输出了些什么。
所以领导要求,点击运行后,就让它后台工作,页面里需要显示运行情况。
请大家支招,谢谢。
------解决方案--------------------不允许缓存就能实时输出了,但要注意一点:
flush() 函数不会对服务器或客户端浏览器的缓存模式产生影响。因此,必须同时使用 ob_flush() 和 flush() 函数来刷新输出缓冲。
个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。
有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致 flush()函数产生的结果不会立即被发送到客户端浏览器。
甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 </table> 标记之前,不会显示出整个表格。
将以下代码在Apache上运行,能看到1S输出一行,但在IIS上运行是一次性输出。
<?php
set_time_limit(50);
for($i=0;$i<=100;$i++){
echo $i.'<hr />';
flush();
ob_flush();
sleep(1);
}
?>
------解决方案--------------------正好下午用到,分享给你win32环境其实一样,意思是浏览器必须达到4096字节才会向浏览器刷新输出缓存,所以需要填充4096空值
在php.ini
--------
output_buffering = 4096
------
程序里:
echo str_pad('',4096);
ob_flush();
flush();