for ($i=10; $i>0; $i--)
{ エコー $i;
フラッシュ();
睡眠(1);
?>
PHPマニュアルによると
この関数は、これまでのプログラムのすべての出力をユーザーのブラウザに送信します。
上記のコードは $i を毎秒出力するはずです。しかし、実際には必ずしもそうであるとは限りません。 10 秒間待機した後、すべての出力が同時に表示される可能性があります。
さて、このコードを
に変更しましょう
echo str_pad(" ", 256);
for ($i=10; $i>0; $i--)
{ エコー $i;
フラッシュ();
睡眠(1);
} ?>ほら、この文 ob_end_clean(); を追加すればOKです。実際、ob_end_clean() を ob_end_flush() に置き換えても問題ありません。
注: IE は表示を開始する前に 256 バイトを受信する必要があります。
したがって、前に echo str_pad(" ", 256);
を追加する必要があります。
また変更します。
echo str_pad(" ", 256);
for ($i=10; $i>0; $i--)
{ エコー $i;
ob_flush();//一部を変更
フラッシュ();
sleep(1); } ?>実行してみると、$i も毎秒出力されていることがわかりますか?どうしてこれなの?
心配しないで、php.ini を見てみましょう。
php.ini を開いて、output_buffering を検索すると、output_buffering = 4096 のような設定が表示されます。 Output_buffering という名前のように、この設定の機能は出力をバッファリングすることです。バッファー サイズは 4096 バイトです。
最初のコード部分で、出力が期待どおりにならない理由は、正確には、この output_buffering がすべての出力をバッファリングしているためです。出力は、4096 バイトに達するか、スクリプトが終了するまで送信されません。
2 番目のコードの ob_end_clean() と ob_end_flush() の機能は、バッファリングを終了することです。この方法では、送信前に 4096 バイトのバッファができるまで待つ必要はありません。
3 番目のコードでは、ob_flush() が使用されます。その機能はバッファリングされたデータを送信することですが、バッファリングは終了しないため、各 flash() の前に使用する必要があります。
ob_end_clean()、ob_end_flush()、および ob_flush() を使用したくない場合は、php.ini の Output_buffering を十分に小さい値 (たとえば、0 に設定) に設定する必要があります。 ini_set("output_buffering", "0") を使用してスクリプト内で設定する予定がある場合は、中止してください。このメソッドは機能しません。スクリプトの開始時にバッファリング設定がロードされ、その後バッファリングが開始されるためです。
ob_flush() はバッファリングされたデータを送信するのに、なぜフラッシュ() を使用する必要があるのかと疑問に思われるかもしれません。次のコードを使用するだけではだめでしょうか? ?
echo str_pad(" ", 256);
for ($i=10; $i>0; $i--)
{ エコー $i;
ob_flush();
sleep(1); } ?>ob_flush() と flash() の違いに注意してください。前者はPHPのバッファからデータを解放することであり、後者はバッファにないデータまたは解放されたデータをブラウザに送信することです。したがって、バッファが存在する場合は、ob_flush() と flash() を同時に使用する必要があります。
では、ここではflush()が不可欠なのでしょうか?いいえ、データが出力されるとすぐにブラウザーに送信される別の方法があります。次の 2 つのコードでは、flush() を使用する必要はありません。 (output_buffering を 0 に設定すると、ob_flush() と ob_end_clean() も必要なくなります)
ob_implicit_flush(true);
echo str_pad(" ", 256);
for ($i=10; $i>0; $i--)
{ エコー $i;
ob_flush();
睡眠(1) } ?>
ob_implicit_flush(true);
echo str_pad(" ", 256);
for ($i=10; $i>0; $i--)
{ エコー $i;
睡眠(1);
?> 上記の ob_implicit_flush(true) に注意してください。この関数は、出力があるたびに出力を強制的にブラウザーに送信します。この方法では、各出力 (エコー) の後にフラッシュ() を使用してブラウザに送信する必要はありません。一部のブラウザでは、上記の議論が当てはまらない場合があります。ブラウザにも独自のルールがあるためです。テストにはFirefox1.5、IE6、opera8.5を使用しました。このうち、opera は HTML タグに遭遇しないとスクリプトが終了しない限り出力しないというルールがあるため、正常に出力することができません。 FireFoxとIEは比較的普通です。
引用:Lin Xiさんのブログ