0

我目前正在使用 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()等...)

4

2 回答 2

1

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

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

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

于 2012-09-14T12:23:03.343 回答
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 -刷新组合。

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

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

于 2012-09-14T12:41:09.710 回答