ホームページ >バックエンド開発 >PHPチュートリアル >PHP 出力バッファリング あなたはどれくらい知っていますか
PHP の Output_buffering
PHP では、キャッシュをクライアント キャッシュ (ブラウザ キャッシュ) とサーバー キャッシュ (サーバー キャッシュ) に大別できます。 PHP は B/S アーキテクチャに基づいているため、ブラウザ側キャッシュとサーバー側キャッシュとして理解できます。
PHP に付属しているサーバー側のキャッシュは、大きく 2 種類のキャッシュに分けられます。プログラムキャッシュとOBキャッシュ!これは、サーバーサイド キャッシュの研究の主要な内容でもあります。
php 出力キャッシュを開きます: echo,print -> php out_buffering -> -> ブラウザのバッファリング -> ブラウザの表示
php 出力キャッシュがオンになっていません: echo,print -> ブラウザのバッファリング ->
ブラウザ出力キャッシュ: IE の場合は 256 バイト、Chrome および FireFox の場合は 1000 バイト。出力データがこの長さに達するか、スクリプトが終了した場合にのみ、ブラウザはページにデータを出力します。 2. サーバー側の応答プロセス A. クライアントがサーバーにリクエスト応答を送信します。B. Apache サーバーは PHP モジュールをロードし、対応するプロセス (またはスレッド) を開始し、対応する PHP スクリプト ページを実行します。
C. OB キャッシュがオンになっていない場合、すべての実行結果はプログラム キャッシュに配置され、パッケージ化されてブラウザに送信されます。ブラウザはページをレンダリングし、最後に見た WEB ページを生成します。
D. OB キャッシュがオンになっている場合、実行結果は OB キャッシュとプログラム キャッシュにそれぞれ格納され、プログラムが最後の行まで実行されると、OB キャッシュ内のデータがフラッシュ バックされます。キャッシュされてからパッケージ化されてブラウザに返されます。ブラウザはページをレンダリングし、私たちが見ている WEB ページを生成します。
for($i=0; $i<5; $i++){ echo $i.'<br>'; sleep(1); }実行結果: データがすべて完了するまで待ちます。バッファのサイズを満たしません。 b、output_buffering=4096、出力するデータを少なくします (バッファー 1 つ未満)、output_buffering をオフにし、php.ini の Output_buffering=0 を変更します
echo str_repeat(" ",1024);//这里重复输出一个空白for($i=0; $i<5; $i++){ echo $i."<br/>"; flush(); sleep(1); }実行結果: OB が無効になっているため、出力する前にスクリプトの実行を待つ必要はありません。データは OB に残らず、断続的な出力が表示されます。 echo ->ブラウザ バッファリング -> ブラウザ表示 c、output_buffering=4096、より大きなデータ (1 つのバッファより大きい) を出力、ob_start()
for($i=0; $i<5; $i++){ echo file_get_contents('f.txt').$i.'<br/><br/><br/><br/>'; sleep(2); }実行結果: f.txt は 4kb を超えるファイルです。バッファの容量が足りないため、バッファごとに出力されます。がいっぱいであるため、断続的な出力が見られます。 d、output_buffering=4096、より大きなデータ (1 つのバッファーより大きい) を出力、ob_start() を使用
ob_start(); for($i=0; $i<5; $i++){ echo file_get_contents('f.txt').$i.'<br/><br/><br/><br/>'; sleep(2); }の実行結果: ob_start()を使用しているためバッファに十分な容量が設定されており、スクリプト実行まで保存され出力されます。 e、output_buffering=On、ob_start() を使用
ob_start(); echo "abc-";header("content-type:text/html;charset=utf-8");echo "hello-";ob_end_flush();echo "aa-";echo ob_get_contents();実行結果: abc-hello-aa-abc-hello- aa- f、output_buffering=Off、ob_start() を使用
ob_start(); echo "abc-";header("content-type:text/html;charset=utf-8");echo "hello-";ob_end_flush();echo "aa-";echo ob_get_contents();実行結果: abc-hello-aa-
出力バッファーはスタック可能です。つまり、1 つの ob_start() がアクティブなときに、別の ob_start() を呼び出すことができます。 ob_end_flush() を適切な回数だけ正しく呼び出すようにしてください。複数の出力コールバック関数がアクティブな場合、出力コンテンツは常にネストされた順序でフィルター処理されます。
注: PHP5.2 では、OB はデフォルトでオフになり、5.3 以降ではデフォルトでオンになります。 > 一般的に使用されるメソッド: 1.ob_start
Output_buffering メカニズムをアクティブ化すると、スクリプトはブラウザーに直接出力されなくなりますが、一時的に PHP バッファリング領域に書き込まれます。 。スクリプトの実行が完了するまで送信されません。2.ob_get_contents
PHP バッファリングでデータを取得します。 注: ob_end_clean() の前に呼び出す必要があります。そうしないと、空の文字のみが取得されます。
3.ob_end_flush と ob_end_clean
ob_end_flush は、php バッファリングにデータを出力しますが、クリアしません。
ob_end_clean は出力せず、php バッファリング内のデータをクリアするだけです。
4.ob_flush、flush、ob_implicit_flush
ob_flush は、php バッファリング内のデータをプログラム キャッシュに更新します
flush は、プログラム キャッシュをブラウザ キャッシュに更新します
ob_implicit_flush は、絶対的 (暗黙的) フラッシュをオンまたはオフにします。絶対的 (暗黙的) フラッシュでは、各出力呼び出しの後にフラッシュ操作が行われるため、flush() への明示的な呼び出しは不要になります
OB キャッシュはさまざまな側面で使用されますが、私が知っているのは主に 2 つの側面です。
a. Web サイトを静的にする場合は、OB キャッシュを選択することをお勧めします。
b. 「警告: ヘッダー情報を変更できません - ヘッダーはすでに送信されました!」というエラーを解決します。
エラーの理由: 応答ヘッダーと対応する本文の不整合が原因です。通常の状況では、サーバーからブラウザに返される対応するコンテンツは次のようになります。 応答ヘッダー 応答本文!
ただし、OB キャッシュを有効にすると、対応するヘッダー情報 (通常は header() 関数によって設定された情報) がプログラム キャッシュに配置されます。
echo print_r var_dump などの他の出力コンテンツは、最初に OB キャッシュに入れられます。
プログラムが終了するか、OB キャッシュが閉じたら、OB キャッシュの内容をプログラム キャッシュに入れます。これにより、応答ヘッダー情報が常に応答本文の内容よりも前に配置されるようになります。
http://segmentfault.com/a/1190000000578885
http://blog.csdn.net/fdipzone/article/details/ 10367837
http://php.net