出力バッファリングとは何ですか?


回答:


274

Web開発者向けの出力バッファリング、初心者向けガイド

出力バッファリング(デフォルト)を使用しない場合、HTMLは、PHPがスクリプトを通じて処理するときに、ブラウザーに分割して送信されます。出力バッファリングでは、HTMLは変数に格納され、スクリプトの最後に1つとしてブラウザに送信されます。

Web開発者にとっての出力バッファリングの利点

  • 出力バッファリングのみをオンにすると、PHPがHTMLを処理するときにHTMLがバラバラにブラウザに送信されないため、HTMLのダウンロードとレンダリングにかかる​​時間が短縮されます。
  • PHP文字列を使用して実行できるすべての優れた機能は、1つの変数としてHTMLページ全体を使用して実行できます。
  • Cookieの設定中に「警告:ヘッダー情報を変更できません-ヘッダーは(出力)によってすでに送信されています」というメッセージが表示された場合は、出力バッファリングが適切であることがわかります。

6
+1。ここでは、別の有用なリンクがあります:php.net/manual/en/function.ob-start.php -も役立つ機能とそのエコーあなたではなく、変数に格納したいという値を扱うとき。
Cam

本当にすべてが最後までバッファリングされますか、それとも非常に長いページがある場合、ページはチャンクになってしまいますか?
zedoo 2010年

5
@zedooで出力バッファリングを開始するとob_start()実際にはすべてがバッファリングされます。オプションの二番目のパラメータが存在しob_start()int $chunk_size設定された場合、バッファがこのサイズに等しいか、または超過するバッファの長さを引き起こす任意の出力コールの後にフラッシュされます、、。
斧。

12
「警告:ヘッダー情報を変更できません」というメッセージが表示された場合、出力バッファリングを有効にすることは症状の修正であり、原因ではないため、最初にコードを監査する必要があります。それがターンになる前に何かが書いています。だから私は同意しませんが、答えを下げるには十分ではありません。
Glenn Plas 2013

5
私はバッファリングを使用することの進歩しか見ていません、それでなぜそれはPHPでデフォルトで有効になっていませんか?
トーマスバンデラス2017年

69

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 );
    }
?>

ここでAxと同じ質問:後でオフにしないと出力バッファリングが開始されないので、スクリプトであらゆる種類の問題が発生しますか?
Edward Stumperd 2012

1
フラッシュメソッドのob_flush()いずれか(またはなどob_end_flush())を呼び出すと、バッファがフラッシュされます。バッファの内容は、スクリプトが突然またはその他の方法で終了したときにもフラッシュされるため、問題はありません。
Salman A

17

これは古い質問であることは知っていますが、視覚的な学習者のために私の答えを書きたかったのです。ワールドワイドウェブで出力バッファリングを説明する図が見つからなかったので、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

例付きの出力バッファの詳細については、次の場所を参照してください。

http://www.hackingwithphp.com/13/0/0/output-buffering


9

出力制御関数を使用すると、スクリプトから出力が送信されるタイミングを制御できます。これは、特にスクリプトがデータの出力を開始した後にヘッダーをブラウザーに送信する必要がある場合に、いくつかの異なる状況で役立ちます。出力制御関数は、header()またはsetcookie()を使用して送信されたヘッダーには影響しません。echo()などの関数とPHPコードのブロック間のデータにのみ影響します。

http://php.net/manual/en/book.outcontrol.php

その他のリソース:

PHPでの出力バッファリング


4

名前が示すように、スクリプトの出力がどのように表示されるかを管理するために使用されるメモリバッファ。

ここにトピックのための1つの非常に良いチュートリアルがあります


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


0

UPDATE2019。専用サーバーとSSD以上のNVMがある場合は、3.5GHZ。100ミリ秒から150ミリ秒でウェブサイトの読み込みを高速化するために、バッファリングを使用しないでください。

Becouseネットワークは、パフォーマンスサーバー(サーバー、メモリ、ディスク)を使用してAPC PHPをオンにした2019年のスクリプトの処理よりもゆっくりです。ユーザーサーバー。

したがって、150ms高速にしたい場合は、バッファリングによって速度が低下します。追加の収集バッファデータが必要になるため、追加のコストが発生します。10年前、サーバーが1sスクリプトを作成したとき、それは役に立ちました。

jpgを使用して読み込みをフラッシュしたい場合は、output_bufferingに制限があることに注意してください。

乾杯。

あなたは速い川を作ることができますまたはあなたは安全にタマを作ることができます:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.