通过php类函数循环打印进度

时间:2012-09-14 12:05:57

标签: php apache http

我正在与aOuth和其他人的服务器做一些事情,而我创建的类工作时却没有保留HTML页面的进度。例如,说我有以下课程:

class Something {
    function a() {
        sleep(2); echo "a()"; return TRUE;
    }
    function b() {
        sleep(2); echo "b()"; return TRUE;
    }
    function c() {
        sleep(2); echo "c()"; return TRUE;
    }
}

然后我循环遍历HTML中的类:

$something = new Something();
if($something->a()) {
    if($something->b()) {
        if($something->c()) {
            echo "everything completed!!";
        }
    }
}

页面将呈现:

a()b()c()everything completed!!

6秒后。我希望它随着时间的推移进行更新(例如,当它完成处理某事时打印a() - > a(),当它完成处理某事时打印b() - > b()等...... )

2 个答案:

答案 0 :(得分:1)

每次希望使用ob_flush函数显示进度时,请尝试刷新输出缓冲区。

每次输出一些文本时,如果启用了输出缓冲,则会将其添加到缓冲区而不是立即发送到客户端。当请求完成处理时,输出将立即发送。

如果刷新缓冲区,则强制PHP发送已有的文本,而不等待请求完成。

答案 1 :(得分:1)

在Chrome 21,Firefox 15和IE8中为我工作:

<?php
header( 'Content-Type: text/html; charset=utf-8' );

class Something {
    function a() {
        echo "a()" . str_repeat(' ', 1024); 
        ob_flush(); flush(); 
        sleep(2); return TRUE;
    }
    function b() {
        echo "b()" . str_repeat(' ', 1024); 
        ob_flush(); flush(); 
        sleep(2); return TRUE;
    }
    function c() {
        echo "c()" . str_repeat(' ', 1024); 
        ob_flush(); flush(); 
        sleep(2); return TRUE;
    }
}

$something = new Something();
if($something->a()) {
    if($something->b()) {
        if($something->c()) {
            echo "everything completed!!";
        }
    }
}

说明:我们必须说服立即开始输出......

  • PHP处理器,ob_flush - flush组合。

  • Apache(网络服务器),在脚本开头发送Content-Type标题。

  • 网络浏览器,因为他们中的一些人不会考虑绘制部分输出,除非它足够大。解决方法是在输出中附加一个相当大但空的字符串(str_repeat(' ', 1024))。