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


print progress as looping through php class functions

我现在正在使用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(),等等…)

曾在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(web服务器),在脚本的开头发送Content-Type头。

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

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

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

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