ホームページ > バックエンド開発 > PHPチュートリアル > PHP 出力バッファ_PHP チュートリアル

PHP 出力バッファ_PHP チュートリアル

WBOY
リリース: 2016-07-13 10:10:06
オリジナル
747 人が閲覧しました

PHP用の出力バッファ

バッファとは何ですか?

簡単に言うと、バッファの機能は、入力または出力の内容を表示したり読み取ったりせずに、最初にメモリに入れることです。なぜバッファがあるのか​​については、これは非常に幅広い質問です。興味があれば調べてください。オンライン情報
実際、バッファの最も重要な役割は、高速 CPU と比較的低速な IO デバイス (ディスクなど) の動作を調整することです。

PHPが実行されるとき、バッファはどこに使用されますか?

PHPのバッファを理解したい場合は、PHPの実行時にバッファがどこに設定されるかを知る必要があります。
PHPを実行する際、echo print_rなどのデータを出力するコードに遭遇すると、PHPは出力するデータをPHP自身のバッファに入れて出力を待ちます。 PHP自身のバッファは、バッファの内容を出力する命令を受け取ると、バッファ内のデータをApacheに出力し、ApacheはPHPが出力したデータを受け取り、そのデータをApache自身にバッファに格納し、出力されるまで待ちます
。 Apache が命令を受け取り、バッファの内容のみを出力したい場合、Apache はバッファの内容を出力してブラウザに返します。

PHP がデータを出力したい場合、2 つのバッファー (最初は独自のバッファー、次に Apache のバッファー) を通過し、その後ブラウザーに戻ることがわかります。

PHP でバッファーはどのような役割を果たしますか? 1. 最も一般的なのは、ヘッダー関数を使用する前に一部のデータが出力されていることです。これにより、次のような特定のエラーが発生します。ヘッダー情報は変更できません – ヘッダーはすでに送信されています。

1 2 );
echo「これ テストです"<code class="php plain">; header(<code class="php plain">;header("LOCATIONhttp://www.baidu.com");"LOCATIONhttp://www.baidu.com"
🎜 🎜このエラーの理由は、ヘッダーの前にいくつかのデータが出力されており、このデータの出力中に、Apache が同時にブラウザーに応答ステータスを送信するためです (出力があるため、このリクエストは有効です)。ヘッダー関数再び

http ヘッダーを送信すると、このエラーが返されます。このエラーは、HTTP ヘッダーが送信されたため、変更できないことを意味します。 なぜバッファを使用するとこのエラーを回避できるのでしょうか?
ヘッダー関数はバッファーの影響を受けないため、ヘッダー関数に遭遇すると、PHP はすぐに Apache を実行して、この http ヘッダーをブラウザーに送信します。
出力データ PHP が出力バッファーを開いた後、データはバッファーに保管され、出力を待機します。これにより、以前に発生したエラーを回避できます。 2. PHP を通じてファイルダウンロードプログラムを作成する場合。
ファイルのダウンロードをより安全にし、制御性を向上させるために、多くの友人は PHP を使用してファイル ダウンロード ページを作成することを好みます。原理は非常に単純です。fwrite を通じてファイルの内容を読み取って表示し、次に header を通じて HTTP ヘッダーを送信します。 、この方法で、これが添付ファイルであることをブラウザーに知らせます
ダウンロードを提供する効果を達成できます。
上記の方法を使用してダウンロード ページを提供する場合、ファイルが非常に大きい場合 (たとえば 100M)、バッファ出力をオンにせずに 100M のデータをすべて読み取ってから、そこに戻る必要があるため、効率の問題が発生します。ページ上でこれを行うと、ユーザーはすべてのデータを読み取ります
応答は後まで受信されないため、ユーザー エクスペリエンスが低下します。
出力バッファが有効な場合、PHP プログラムはファイルの特定のセクションの読み取りを完了すると、それをすぐに Apache に出力し、Apache がすぐにブラウザに戻るようにすることで、ユーザーの待ち時間を短縮できます。データをセクションごとに読み取る while ループを作成できますか? 段落が読み取られるたびに、すべてのファイルが出力されるまですぐに出力されるため、ブラウザはすべてのファイルが読み取られるまで待つことなくデータを受信し続けることができます。
さらに、このアプローチは、別の非常に深刻な問題も解決します。たとえば、ファイルが 100M の場合、バッファーがオンになっていない場合、100M ファイル全体をメモリに読み込んでから出力する必要があります。プログラムはサーバーの安定性を確保するために、通常、PHP を実行します
メモリ制限はどうなりますか? メモリに制限を設定します (php.ini の合計memory_limit により、デフォルト値は 8M)。つまり、各 PHP プログラムが使用するメモリはこの値を超えて使用できず、ファイルは 8M であるとします。読み取られるサイズは 100M です。現時点では、ファイルを読み取るのに十分なメモリがありません。
この問題を解決する方法は、メモリの制限を避けるために、一度に特定の段落だけを読むことです
3. 静的ファイルのキャッシュ

現在、多くの企業では、特定のページに初めてアクセスしたときに、PHP が実行され、表示されたコンテンツがブラウザに返される必要があります。サーバーに保存されるので、次回アクセス時にPHPを介さずにサーバーに保存されたファイルが直接表示されます

これはいわゆる「静的ページ キャッシュ」です。では、コンテンツをブラウザーに返し、同時にデータをサーバーに保存するにはどうすればよいでしょうか。これには出力バッファーを使用する必要があります。




1 2 3 4 5 6

= ob_get_contents();ob_flush();flush
file_put_contents<code class="php plain">ob_start();echo 'aaa'<code class="php plain">;($string'a.html'<code class="php plain">,file_put_contents('a.html',$string);ob_flush();flush(););
🎜();🎜 🎜 🎜 🎜 🎜

出力バッファ関連の設定

PHP.INI には、バッファーに密接に関連する 2 つの設定項目があります
1.出力バッファリング
この設定は php 自体のバッファに直接影響し、on/off/xK (x は整数値) の 3 つの設定パラメータがあります。 on - バッファをオンにします
off - バッファーをオフにします
256k - バッファをオンにすると、バッファの内容が 256k を超えると、バッファが自動的に更新されます (データが Apache に送信されます)。

2.implicit_flush

この設定は Apache のバッファに直接影響し、on/off の 2 つの設定パラメータがあります
。 on - Apache バッファを自動的に更新します。つまり、PHP が Apache バッファにデータを送信するときに、他の命令を待つ必要がなく、出力をブラウザに直接返します
off - Apache バッファを自動的に更新しません。データを受信した後、更新コマンドを待ちます


バッファ関連関数 1.ob_implicit_flush

関数はimplicit_flushと同じで、Apacheのバッファを自動的にリフレッシュするかどうかです
2.フラッシュ
この機能は、Apache に命令を送信し、Apache 自身の出力バッファーを更新させることです。
3.ob_start
出力バッファを開きます。php.ini ファイルの設定に関係なく、この関数を使用すると、output_buffering が off に設定されている場合でも、出力バッファが開きます
ob_start 関数は、関数のコールバックであるパラメーターも受け入れます。つまり、バッファーの内容を入力する前に、呼び出しで渡されたパラメーターを使用してバッファーの内容を一度処理し、それをバッファーに入れる必要があります
4.ob_flush
php 自体に独自のバッファを更新し、データを Apache に送信するように指示します
5.ob_clean
PHPバッファの内容をクリアします
6.ob_end_clean
PHPバッファの内容をクリアし、出力バッファを閉じます
7.ob_end_flush
php自身のバッファの内容をApacheに送信し、自身のバッファの内容をクリアします
8.ob_get_clean
バッファの内容を取得したら、バッファをクリアします。
9.ob_get_contents
出力バッファの内容を取得します
10.ob_get_flush
バッファの内容を取得してApacheに送信します
11.ob_get_length
バッファー内のコンテンツの長さを取得します
12.ob_list_handlers
ob_start の実行時にコールバックされる関数の名前を取得します。例:
ob_start('ob_gzhandler');
print_r(ob_list_handlers);
ob_gzhandler を出力します;
13.ob_gzhandler
この関数の機能は、ob_start のコールバック パラメータとして使用されます。バッファが更新される前に、この関数が呼び出され、データに対して gzip 圧縮または deflate 圧縮が実行されます。この関数は zlib 拡張子のサポートを必要とします。

バッファの使用に関する関連コンテンツ 1. ob_flush と flash の順序関係 上記の分析から、ob_flush は PHP 自体に関連しており、flush は Apache バッファーを操作することがわかります。したがって、これら 2 つの関数を使用する場合は、最初に ob_flush を実行する必要があります。 次に、flush を実行します。これは、最初に PHP から Apache にデータを送信し、次に Apache からブラウザにデータを返す必要があるためです。PHP がデータを Apache に更新せずにフラッシュを呼び出した場合、Apache はブラウザにデータを返しません。 。


2. 古いバージョンの IE など、一部のブラウザでは受信する文字が少なすぎるとデータが表示されません (表示するには 256k を超える必要があります)。これは、明らかに php と apache の操作で問題になります。バッファの更新が実行されましたが、ブラウザに必要なデータが表示されないことが原因である可能性があります。そのため、テストする場合は、出力データの後に複数のスペースを追加してデータを埋めるようにしてください。ブラウザはそのような奇妙な問題を引き起こしません。

3. 一部の Web サーバーには、独自の出力バッファーにいくつかの制限があります。たとえば、nginx の構成は fastcgi_buffer_size 4k です。これは、独自の出力バッファーの内容が 4K に達するまで更新されないことを意味します。コンテンツ データに次のコードを追加して、コンテンツの長さを確保できます

1 2 3 4 5 4. Apache では、mod_gzip の圧縮モジュールを有効にすると、フラッシュ関数が失敗する可能性があります。これは、PHP がフラッシュ関数を実行するときに、Apache に出力を更新するよう指示するためです。バッファが存在するが、コンテンツを圧縮する必要がある場合、Apache はコンテンツを独自の mod_gzip モジュールに出力します。mod_gzip には独自の出力バッファもあり、すぐに出力されないため、この状況を改善するためにコンテンツをすぐに出力できません。 mod_gzip モジュールをオフにするか、次の内容を httpd.conf に追加して圧縮を無効にすることができます
<?php 」 "echo str_repeat(,4096);<code class="php string"> <code class="php plain">?> ,4096); ?>

1

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/938945.html技術記事 PHPの出力バッファとは何ですか? 簡単に言うと、バッファの機能は、入力または出力の内容を表示したり読み込んだりせずに、最初にメモリに入れることです。
SetEnv no-gzip dont-vary SetEnv no-gzip dont-vary
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート