1

私のコード:

@ini_set('zlib.output_compression',0);
@ini_set('implicit_flush',1);
@ob_end_clean();
set_time_limit(0);
function show_status($done, $total, $size=30) {
    static $start_time;

    if($done > $total) return;

    if(empty($start_time)) $start_time=time();
    $now = time();

    $perc=(double)($done/$total);

    $bar=floor($perc*$size);

    $status_bar="[";
    $status_bar.=str_repeat("=", $bar);
    if($bar<$size){
        $status_bar.=">";
        $status_bar.=str_repeat(" ", $size-$bar);
    } else {
        $status_bar.="=";
    }

    $disp=number_format($perc*100, 0);

    $status_bar.="] $disp%  $done/$total";

    @$rate = ($now-$start_time)/$done;
    $left = $total - $done;
    $eta = round($rate * $left, 2);

    $elapsed = $now - $start_time;

    $status_bar.= " remaining: ".number_format($eta)." sec.  elapsed: ".number_format($elapsed)." sec.";

    echo "$status_bar\r";

    flush();

    if($done == $total) {
        echo "\n";
    }
}

呼び出しは単純に show_status($count, $total_count); です。-何らかの理由で私のサーバーでは機能しませんが、上記のコードが機能することはわかっています(ネットから取得したもので、以前に別のサーバーで使用したことがあります)。現在のサーバーで現在抱えている問題は、実行ごとに出力されず、すべてが処理された後に最終結果 (100%) のみが表示されることです。

  • 出力バッファリングはオフに設定されています (ただし、CLI 経由で実行されるため、これは必要ありません)。
  • zlib.output_compression を Off に設定
  • 明示的に設定しようとしている他の設定へのコードの最初の 4 行を参照してください
  • また、.htaccess に "SetEnv no-gzip dont-vary" を含めます。これは明らかに、flush() が機能しないもう 1 つの原因であるためです。

何が足りないの!? これはブラウザーの問題ではありません。これも CLI 経由で実行しているためです。PS: これを WAMP で php 5.3.6 と apache 2.2.16 で実行しています

4

1 に答える 1

2

スクリプトを調べたところ、問題はないと思います。このテストを実行すると、ステータスが 8% 完了したことを示す 1 行が表示されました。

show_status(10, 1000);
show_status(40, 1000);
show_status(80, 1000);
echo "\n";

ただし、このスクリプトを実行すると:

show_status(10, 1000);
sleep(5);
show_status(40, 1000);
sleep(5);
show_status(80, 1000);
echo "\n";

出力行は、ステータス 1%、4%、8% で 5 秒ごとに定期的に置き換えられます

ステータスを追跡しているのは、出力がレンダリングされるよりもはるかに速く完了する単純なものであり、完了した結果が表示されていると思います。

flush() は CLI には影響しません。

于 2013-03-01T09:56:56.593 に答える