set_time_limit(0);
例如下面这个程序:
for($i=0;$i<10;$i++){
    echo $i;
    sleep(1);
}
我需要它每秒输出一次,而不是10秒完成后再一起输出1到10。实际情况:
我有一个PHP文件,它一次需要运行两个小时,就是for,foreach,while这种正常的循环。
现在的问题就是页面要运行完了之后才输出结果,这两个小时之内,页面不能关,不能刷新。我都看不到程序的进行情况,比如现在循环到几了,输出了些什么。
所以领导要求,点击运行后,就让它后台工作,页面里需要显示运行情况。
请大家支招,谢谢。

解决方案 »

  1.   

    不允许缓存就能实时输出了,但要注意一点:
    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);
    }
    ?>
      

  2.   

    谢谢您的回答,我现在就是win32下的web环境,所以,也是会程序结束才会输出。
      

  3.   

    正好下午用到,分享给你win32环境其实一样,意思是浏览器必须达到4096字节才会向浏览器刷新输出缓存,所以需要填充4096空值在php.ini 
    --------
    output_buffering = 4096
    ------程序里:
    echo str_pad('',4096);
    ob_flush();
    flush();
      

  4.   

    哇,谢谢分享,这个用法以后可以常用到了。这样就可以实时输出了。
    另外,要程序完全不受浏览器控制的话,可能就只有用shell或者直接php_cli来完成,同时把执行情况写入数据库,另外起一个页面查询数据库,得到现在的状态。因为这个页面本身没有执行完shell程序,也不可能去做查询的动作了。