ホームページ  >  記事  >  バックエンド開発  >  PHP_PHP チュートリアルでの出力バッファリングの分析

PHP_PHP チュートリアルでの出力バッファリングの分析

WBOY
WBOYオリジナル
2016-07-21 15:58:29740ブラウズ

まずコードを見てみましょう:

?php
for ($i=10; $i〉0; $i--)
echo $i;
sleep(1); PHP マニュアルによると、この関数はこれまでのプログラムの出力をすべてユーザーのブラウザに送信します。

上記のコードは毎秒 $i を出力するはずです。しかし、実際には必ずしもそうであるとは限りません。 10 秒間待機した後、すべての出力が同時に表示される可能性があります。

さて、このコードを

〈?php
ob_end_clean();//
の部分を ($i=10; $i〉0; $i--) に変更しましょう
{
echo $i; flash();
sleep(1);
}
?〉
この文 ob_end_clean(); を追加すればOKです。実際、ob_end_clean() を ob_end_flush() に置き換えても問題ありません。

また変更させていただきます。
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() はバッファリングされたデータを送信するのに、なぜフラッシュ() を使用する必要があるのか​​と疑問に思われるかもしれません。次のコードを使用するだけではだめでしょうか? ?
?〉
ob_flush () と flash() の違いに注意してください。前者はPHPのバッファからデータを解放することであり、後者はバッファにないデータまたは解放されたデータをブラウザに送信することです。したがって、バッファが存在する場合は、ob_flush() と flash() を同時に使用する必要があります。

ここでflush()は必須ですか?いいえ、データが出力されるとすぐにブラウザーに送信される別の方法があります。次の 2 つのコードでは、flush() を使用する必要はありません。(output_buffering を 0 に設定すると、ob_flush() と ob_end_clean() も必要なくなります) --)
echo $i; echo $i; ob_implicit_flush(true); 0; $i--)
{
echo $i;
sleep(1); }
?〉
上記の ob_implicit_flush(true) に注意してください。この関数は出力があるたびに強制的に出力をフラッシュします。出力はブラウザに送信されます。この方法では、各出力 (エコー) の後にフラッシュ() を使用してブラウザに送信する必要はありません。

上記の苦情は一部のブラウザでは当てはまらない場合があります。ブラウザにも独自のルールがあるためです。テストにはFirefox1.5、IE6、opera8.5を使用しました。このうち、opera は HTML タグに遭遇しないとスクリプトが終了しない限り出力しないルールとなっているため、正常に出力することができません。 FireFoxとIEは比較的普通です。

最後に、PuTTYshell によって書かれた非常に興味深いコードを紹介します。スクリプト サイクルでは、各出力が前の出力を上書きします。
次のコードは Firefox でのみ使用できます。他のブラウザは multipart/x-mixed-replace の Content-Type をサポートしていません。

header('Content-type: multipart/x-mixed-replace;boundary = セクションの終わり');
print “n--endofsectionn”;

$pmt = array(”-”, “\”, “|”, “/”); $i = 0; $i "Content-Type: Text/PLAINNN" を印刷します。 $ PMT [$ i%4]; ;



http://www.bkjia.com/PHPjc/317565.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/317565.html

技術記事

まずコードの一部を見てみましょう: PHP によると、マニュアルでは、この関数はこれまでのプログラムのすべての出力をユーザーに送信します...





声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。