簡単に言うと、バッファの機能は、入力または出力の内容を表示したり読み取ったりせずに、最初にメモリに入れることです。なぜバッファがあるのかについては、これは非常に幅広い質問です。興味があれば調べてください。オンライン情報
実際、バッファの最も重要な役割は、高速 CPU と比較的低速な IO デバイス (ディスクなど) の動作を調整することです。
PHP がデータを出力したい場合、2 つのバッファー (最初は独自のバッファー、次に Apache のバッファー) を通過し、その後ブラウザーに戻ることがわかります。
echo 「これ
テストです"<code class="php plain">;
header(<code class="php plain">; header( "LOCATIONhttp://www.baidu.com" ); "LOCATIONhttp://www.baidu.com"
|
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. 静的ファイルのキャッシュ
これはいわゆる「静的ページ キャッシュ」です。では、コンテンツをブラウザーに返し、同時にデータをサーバーに保存するにはどうすればよいでしょうか。これには出力バッファーを使用する必要があります。
1
2
3
4
5
6
= ob_get_contents(); |
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 (); );
|
2.implicit_flush
この設定は Apache のバッファに直接影響し、on/off の 2 つの設定パラメータがあります
。
on - Apache バッファを自動的に更新します。つまり、PHP が Apache バッファにデータを送信するときに、他の命令を待つ必要がなく、出力をブラウザに直接返します
off - Apache バッファを自動的に更新しません。データを受信した後、更新コマンドを待ちます
。
2. 古いバージョンの IE など、一部のブラウザでは受信する文字が少なすぎるとデータが表示されません (表示するには 256k を超える必要があります)。これは、明らかに php と apache の操作で問題になります。バッファの更新が実行されましたが、ブラウザに必要なデータが表示されないことが原因である可能性があります。そのため、テストする場合は、出力データの後に複数のスペースを追加してデータを埋めるようにしてください。ブラウザはそのような奇妙な問題を引き起こしません。
3. 一部の Web サーバーには、独自の出力バッファーにいくつかの制限があります。たとえば、nginx の構成は fastcgi_buffer_size 4k です。これは、独自の出力バッファーの内容が 4K に達するまで更新されないことを意味します。コンテンツ データに次のコードを追加して、コンテンツの長さを確保できます
<?php 」
"echo str_repeat ( ,4096);<code class="php string">
<code class="php plain">?>
,4096);
?>
|
SetEnv no-gzip dont-vary
|
SetEnv no-gzip dont-vary
|