web-dev-qa-db-ja.com

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

出力バッファリングとは何ですか?なぜPHPで使用するのですか?

190
Abhimanyu

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

出力バッファリングを使用しない場合(デフォルト)、HTMLはスクリプトを介してPHPプロセスとして断片的にブラウザに送信されます。出力バッファリングを使用すると、HTMLは変数に保存され、スクリプトの最後で1つのピースとしてブラウザに送信されます。

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

  • 出力バッファリングだけをオンにすると、PHPがHTMLを処理するときにブラウザに分割して送信されないため、HTMLのダウンロードとレンダリングにかかる​​時間が短縮されます。
  • PHP文字列でできるすべての派手なことは、1つの変数としてHTMLページ全体でできるようになりました。
  • Cookieの設定中に「警告:ヘッダー情報を変更できません-既に送信されたヘッダー(出力)」というメッセージが表示されたことがあれば、出力バッファリングが答えであることを知っていただければ幸いです。
257
ax.

出力バッファリング は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 );
    }
?>
63
Salman A

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

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

その他のリソース:

PHPによる出力バッファリング

9
Sarfraz

これは古い質問であることは知っていますが、視覚学習者向けに自分の答えを書きたかったのです。ワールドワイドウェブで出力バッファリングを説明する図が見つからなかったため、mspaintで自分で何かを作成しました。

出力バッファリングがオフになっている場合、echoはすぐにデータをブラウザに送信します。

enter image description here

出力バッファリングがオンになっている場合、echoは、データをブラウザに送信する前に出力バッファに送信します。

enter image description here

phpinfo

出力バッファリングのオン/オフを確認するには、コアセクションのphpinfoを参照してください。 output_bufferingディレクティブは、出力バッファリングがオン/オフかどうかを示します。

enter image description here この場合、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

// Get content which is in the output buffer ...  
// ... and delete output buffer  
$output = ob_get_clean();  
$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

5
Julian

名前が示すように、ここでは、スクリプトの出力の表示方法を管理するために使用されるメモリバッファを示します。

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

4
nik
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

1
sudip

2019年アップデート。専用サーバーとSSD以上のNVM、3.5GHZがある場合。 100ミリ秒から150ミリ秒でロードされるWebサイトを高速化するために、バッファリングを使用しないでください。

パフォーマンスサーバー(サーバー、メモリ、ディスク)を使用し、APCをオンにした2019年のスクリプトの処理よりもネットワークが遅いためPHP :)配置されたユーザーサーバーから10ミリ秒から150ミリ秒。

したがって、150ミリ秒の高速でバッファリングを遅くするには、追加のコレクションバッファデータが必要になるため、コストがかかります。 10年前、サーバーが1sスクリプトを作成したとき、それは役に立ちました。

Jpgを使用してロードする場合は、output_bufferingに制限があることに注意してください。

乾杯。

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

0