PHPバッファ

不言
不言オリジナル
2018-05-15 17:46:433170ブラウズ

この記事では PHP バッファーの知識を紹介し、助けが必要な友達に参考にしてもらいましょう

バッファーとは何ですか?
シンプルでシンプルな関数です。バッファーの機能は、入力または出力の内容を、表示したり読み取ったりせずに、最初にメモリーに入れることです。なぜバッファーがあるのか​​というと、これは非常に広範な質問ですが、実際、バッファーの最も重要な機能は次のとおりです。その機能は、高速な CPU と比較的遅い IO デバイス (ディスクなど) の動作を調整することです。

PHPのバッファを理解したい場合は、PHPの実行時にバッファがどこに設定されるかを知る必要があります。

PHPの実行時、echo print_rなどのデータを出力するコードに遭遇すると、PHPは出力するデータをPHP自身のバッファに入れて出力を待ちます


PHP自身のバッファが内容を受け取ったとき、という命令です。バッファーが出力されると、バッファー内のデータが Apache に出力されます。Apache は、PHP が出力したデータを受け取り、出力されるまでデータを Apache 自身のバッファーに保管します

Apache が命令を受け取り、単に出力したい場合バッファの内容を出力すると、バッファの内容を出力してブラウザに返します。PHP がデータを出力する場合、2 つのバッファ (最初は独自のバッファ、次に Apache) を通過することがわかります。次にブラウザに戻ります。

PHP でのバッファの役割は何ですか?

1. 最も一般的なのは、ヘッダー関数を使用する前にデータが出力されているため、ヘッダーを変更できないなどのエラーが発生することです。情報 –

1


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





4

5
2

echo "によってすでに送信されたヘッダーtest";

header("LOCATION http: //www.baidu.com");

echo "this is test";

header("LOCATION http://www.baidu.com");

6 ob_flush();

ob_start();

echo ' aaa';

$string = ob_get_contents() ;

file_put_contents('a.html'<code class="php plain">, $string);

flush();

ob_start();

echo 'aaa';

$string = ob_get_contents();

file_put_contents('a.html', $string);

ob_flush();

flush();


出力バッファに関する設定

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

2.implicit_flush
この設定は Apache バッファに直接影響し、on/off
on の 2 つの設定パラメータがあります。つまり、php がデータを送信するときです。 Apache バッファー、他の命令を待つ必要はなく、出力はブラウザーに直接返されます
off - Apache バッファーを自動的にリフレッシュしません。データを受信した後、リフレッシュ命令を待ちます
buffer
1 .ob_implicit_flush
この関数は、apache バッファを自動的に更新するかどうかを指定する、implicit_flush と同じです。
2.flush
この関数は、Apache に自身の出力バッファを更新させるための命令を送信します。 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_g​​zhandler が表示されます。
13.ob_gzhandler
この関数は、ob_start のコールバック パラメーターとして使用され、データに対して gzip 圧縮または deflate 圧縮を実行するために呼び出されます。 zlib拡張子


のバッファの関連コンテンツを使用します

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

2. 一部のブラウザーでは、受信する文字数が少なすぎると、データが表示されません (古いバージョンの IE など) (表示するには 256k より大きくなければなりません)これは、php と Apache の両方で明らかに疑問が生じます。バッファを更新する操作が実行されましたが、ブラウザに必要なデータが表示されませんでした。そのため、テスト時に複数のデータを追加できる可能性があります。出力データの後にスペースを追加すると、ブラウザーがそのような奇妙な問題を引き起こすことはないと確信しています。これは、独自の出力バッファーが 4K に達するまでコンテンツが更新されないことを意味します。そのため、コンテンツ データを確保するために、次のコードを追加してコンテンツの長さを確保できます

1

2 3
4

5

<?php

echo</code > <code class="php function">str_repeat(" ",4096);

<?php

echo str_repeat(" ",4096);

?><code class="php plain">?>


4. Apache で mod_gzip 圧縮モジュールを有効にすると、フラッシュ関数が更新に失敗する可能性があります。これは、PHP がフラッシュ関数を実行するときに、Apache に出力を更新するように指示するためです。 Apache は独自の mod_gzip モジュールにコンテンツを出力しますが、mod_gzip は独自の出力バッファを持っているため、この状況を改善するためにコンテンツをすぐに出力できません。 mod_gzip モジュールをオフにするか、次の内容を httpd.conf に追加して圧縮を無効にすることができます

1


SetEnv no-gzip dont-vary

関連推奨事項:

詳細PHPバッファのフラッシュの説明 サイトを高速化します

PHPバッファとは何ですか?

以上がPHPバッファの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。