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

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!!";
        }
    }
}

説明: すぐに出力を開始するよう説得する必要があります...

  • ob_flush -フラッシュコンボを備えた PHP プロセッサ。

  • Content-Typeスクリプトの先頭にヘッダーを送信する Apache (Web サーバー) 。

  • 一部の Web ブラウザーは、十分な大きさでない限り、部分的な出力を描画することを考慮しません。回避策は、かなり大きいが空の文字列 ( str_repeat(' ', 1024)) を出力に追加することです。

于 2012-09-14T12:41:09.710 に答える
1

関数を使用して、進行状況を表示するたびに出力バッファーをフラッシュしてみてくださいob_flush

出力バッファリングが有効になっている場合、テキストを出力するたびに、クライアントにすぐに送信されるのではなく、バッファに追加されます。リクエストの処理が完了すると、出力が一度に送信されます。

バッファーをフラッシュすると、要求が完了するのを待たずに、PHP が既に持っているテキストを強制的に送信します。

于 2012-09-14T12:23:03.343 に答える