回答:
出力バッファリング(デフォルト)を使用しない場合、HTMLは、PHPがスクリプトを通じて処理するときに、ブラウザーに分割して送信されます。出力バッファリングでは、HTMLは変数に格納され、スクリプトの最後に1つとしてブラウザに送信されます。
Web開発者にとっての出力バッファリングの利点
- 出力バッファリングのみをオンにすると、PHPがHTMLを処理するときにHTMLがバラバラにブラウザに送信されないため、HTMLのダウンロードとレンダリングにかかる時間が短縮されます。
- PHP文字列を使用して実行できるすべての優れた機能は、1つの変数としてHTMLページ全体を使用して実行できます。
- Cookieの設定中に「警告:ヘッダー情報を変更できません-ヘッダーは(出力)によってすでに送信されています」というメッセージが表示された場合は、出力バッファリングが適切であることがわかります。
ob_start()
、実際にはすべてがバッファリングされます。オプションの二番目のパラメータが存在しob_start()
、int $chunk_size
設定された場合、バッファがこのサイズに等しいか、または超過するバッファの長さを引き起こす任意の出力コールの後にフラッシュされます、、。
PHPでは、出力バッファリングを使用してパフォーマンスを向上させ、いくつかのトリックを実行します。
PHPにすべての出力をバッファーに格納させ、一度にすべてを出力させることで、ネットワークのパフォーマンスを向上させることができます。
特定の状況では、ブラウザのコンテンツをブラウザに送り返さなくても、バッファのコンテンツにアクセスできます。
この例を考えてみましょう:
<?php
ob_start( );
phpinfo( );
$output = ob_get_clean( );
?>
上記の例では、ブラウザーに送信するのではなく、変数に出力を取り込みます。output_bufferingはデフォルトでオフになっています。
この例を考えてみましょう:
<?php
ob_start( );
echo "Hello World";
if ( $some_error )
{
header( "Location: error.php" );
exit( 0 );
}
?>
ob_flush()
いずれか(またはなどob_end_flush()
)を呼び出すと、バッファがフラッシュされます。バッファの内容は、スクリプトが突然またはその他の方法で終了したときにもフラッシュされるため、問題はありません。
これは古い質問であることは知っていますが、視覚的な学習者のために私の答えを書きたかったのです。ワールドワイドウェブで出力バッファリングを説明する図が見つからなかったので、Windowsで自分で図を作成しましたmspaint.exe
。
出力バッファリングがオフになっている場合、echo
データはすぐにブラウザに送信されます。
出力バッファリングがオンにecho
なっている場合、はブラウザにデータを送信する前にデータを出力バッファに送信します。
phpinfo
出力バッファリングがオン/オフになっているかどうかを確認するには、コアセクションのphpinfoを参照してください。output_buffering
出力バッファリングがオン/オフになっている場合ディレクティブはあなたを教えてくれます。
この場合、 output_buffering
値は4096です。これは、バッファーサイズが4 KBであることを意味します。また、Webサーバーで出力バッファリングがオンになっていることも意味します。
php.ini
output_buffering
ディレクティブの値を変更することで、オン/オフを切り替えたり、バッファサイズを変更したりできます。でそれを見つけphp.ini
、選択した設定に変更して、Webサーバーを再起動します。php.ini
以下の私のサンプルを見つけることができます。
; Output buffering is a mechanism for controlling how much output data
; (excluding headers and cookies) PHP should keep internally before pushing that
; data to the client. If your application's output exceeds this setting, PHP
; will send that data in chunks of roughly the size you specify.
; Turning on this setting and managing its maximum buffer size can yield some
; interesting side-effects depending on your application and web server.
; You may be able to send headers and cookies after you've already sent output
; through print or echo. You also may see performance benefits if your server is
; emitting less packets due to buffered output versus PHP streaming the output
; as it gets it. On production servers, 4096 bytes is a good setting for performance
; reasons.
; Note: Output buffering can also be controlled via Output Buffering Control
; functions.
; Possible Values:
; On = Enabled and buffer is unlimited. (Use with caution)
; Off = Disabled
; Integer = Enables the buffer and sets its maximum size in bytes.
; Note: This directive is hardcoded to Off for the CLI SAPI
; Default Value: Off
; Development Value: 4096
; Production Value: 4096
; http://php.net/output-buffering
output_buffering = 4096
このディレクティブoutput_buffering
は、出力バッファリングに関する唯一の設定可能なディレクティブではありません。他の設定可能な出力バッファリングディレクティブは、http://php.net/manual/en/outcontrol.configuration.phpにあります。
例:ob_get_clean()
以下echo
に、ブラウザに送信する前にをキャプチャして操作する方法を示します。
// Turn on output buffering
ob_start();
echo 'Hello World'; // save to output buffer
$output = ob_get_clean(); // Get content from the output buffer, and discard the output buffer ...
$output = strtoupper($output); // manipulate the output
echo $output; // send to output stream / Browser
// OUTPUT:
HELLO WORLD
例:Hackingwithphp.com
例付きの出力バッファの詳細については、次の場所を参照してください。
出力制御関数を使用すると、スクリプトから出力が送信されるタイミングを制御できます。これは、特にスクリプトがデータの出力を開始した後にヘッダーをブラウザーに送信する必要がある場合に、いくつかの異なる状況で役立ちます。出力制御関数は、header()またはsetcookie()を使用して送信されたヘッダーには影響しません。echo()などの関数とPHPコードのブロック間のデータにのみ影響します。
http://php.net/manual/en/book.outcontrol.php
その他のリソース:
名前が示すように、スクリプトの出力がどのように表示されるかを管理するために使用されるメモリバッファ。
ここにトピックのための1つの非常に良いチュートリアルがあります
ob_start(); // turns on output buffering
$foo->bar(); // all output goes only to buffer
ob_clean(); // delete the contents of the buffer, but remains buffering active
$foo->render(); // output goes to buffer
ob_flush(); // send buffer output
$none = ob_get_contents(); // buffer content is now an empty string
ob_end_clean(); // turn off output buffering
バッファは入れ子にすることができるため、1つのバッファがアクティブな間に、別のバッファがob_start()
新しいバッファをアクティブにします。したがってob_end_flush()
、ob_flush()
実際にはバッファーを出力に送信するのではなく、親バッファーに送信します。また、親バッファーがない場合にのみ、コンテンツがブラウザーまたは端末に送信されます。
ここでうまく説明されています:https://phpfashion.com/everything-about-output-buffering-in-php
UPDATE2019。専用サーバーとSSD以上のNVMがある場合は、3.5GHZ。100ミリ秒から150ミリ秒でウェブサイトの読み込みを高速化するために、バッファリングを使用しないでください。
Becouseネットワークは、パフォーマンスサーバー(サーバー、メモリ、ディスク)を使用してAPC PHPをオンにした2019年のスクリプトの処理よりもゆっくりです。ユーザーサーバー。
したがって、150ms高速にしたい場合は、バッファリングによって速度が低下します。追加の収集バッファデータが必要になるため、追加のコストが発生します。10年前、サーバーが1sスクリプトを作成したとき、それは役に立ちました。
jpgを使用して読み込みをフラッシュしたい場合は、output_bufferingに制限があることに注意してください。
乾杯。
あなたは速い川を作ることができますまたはあなたは安全にタマを作ることができます:)