【问题标题】:print progress as looping through php class functions通过 php 类函数循环打印进度
【发布时间】:2012-09-14 12:05:57
【问题描述】:

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

【问题讨论】:

  • 但是该类的新对象如何在 6 秒后创建??
  • 恐怕你得再问一遍这个问题。页面需要 6 秒才能出现,因为通过 3 个功能需要 6 秒 (sleep(2);)
  • 是的,第一次它会工作,但之后新对象将如何自动创建。
  • 新的something 对象不会自动创建
  • 你是说 6 秒后函数 a() 应该被执行。但是如果你不明确地调用 a() 会发生什么。

标签: php apache http


【解决方案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))。

【讨论】:

【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多