7

echoファイルを新しいサーバーに移動し、すべての出力をブラウザーに即座に表示するスクリプトを持っていましたが、これは新しいサーバーでは機能しません。ここに私のテストコードがあります:

@ini_set('output_buffering', 0); @ini_set('implicit_flush', 1);

for ($i = 0; $i < ob_get_level(); $i++) ob_end_flush();

ob_implicit_flush(1);

ignore_user_abort(true); set_time_limit(0);


$max_wait_time = 30;

$begin_time = microtime(true);

$elapsed_time = 0;


while(!connection_aborted()) {

    echo $i++.str_repeat(' ', 1020).'<br/>';

    flush(); ob_flush();

    usleep(1000000);

    if($elapsed_time > $max_wait_time){ break; }

    $elapsed_time++;

}

上記のようになったいくつかのことを試しました。しかし、出力バッファリングをオンにしてフラッシュしてもうまくいきませんでした。Chrome と Firefox でこれをテストしましたが、どちらも最後にすべてを出力するだけです。

何か案は?

4

4 に答える 4

13

flushドキュメントからの抜粋:

flush() は、Web サーバーのバッファリング スキームをオーバーライドできない可能性があり、ブラウザのクライアント側のバッファリングには影響しません。[...]

いくつかのサーバー、特に Win32 では、結果をブラウザーに送信する前にスクリプトが終了するまで、スクリプトからの出力を引き続きバッファーします。

mod_gzip のような Apache 用のサーバー モジュールは、独自のバッファリングを行う場合があり、これにより、flush() によってデータがクライアントにすぐに送信されなくなります。

別の Web サーバー (または Web サーバー構成) に変更した可能性が高く、スクリプト全体の出力を出力する前にバッファーに入れます。

于 2011-03-20T21:01:46.947 に答える
1

探している設定は PHP.ini にあり、output_buffering と呼ばれます。

; output_buffering
;   Default Value: Off
;   Development Value: 4096
;   Production Value: 4096

手動でオフに設定し、ウェブサーバーを再起動して、flush() が 4kb のデータの後ではなく、必要なときに実際に何かをフラッシュするようにします:)

ini_set は必ずしもこのために機能する必要はないことに注意してください。完全な制御が必要な場合は、php.ini 自体で無効にするか、.htacces php_value フラグとして無効にします。

于 2011-03-23T18:13:15.193 に答える
0

.htaccess に追加してみてください

    php_value output_buffering オフ
于 2011-03-26T17:32:19.817 に答える
0

ブラウザーは、いつコンテンツを出力するかを自分で決定します。そのため、そのしきい値を満たしていない場合は、しきい値が満たされるまで待機し、それからさらにコンテンツをユーザーに表示します.

于 2011-03-20T13:00:19.427 に答える