この記事では、主に PHP 出力バッファリング制御について説明します。詳細な関連情報と簡単なサンプル コードは、興味のある友人が参照できるようにここに提供されています。
php バッファリングの概要
php obシリーズ 普段カードをやっているのですが、まだプレイ方法がよくわかっていません。 phperとしてとても恥ずかしいです。ネットで検索して相互にコピーした結果、コードを実行すると著者が説明した現象は発生しません この記事は良心的な製品であり、コードは著者によって実行されています。
echo、printなどの出力を実行する場合。出力はすぐには Web サーバーに送信されませんが、データは PHP バッファーに書き込まれます。 phpのoutput_bufferingメカニズムの利点により、パフォーマンスは確実に向上します。実際、php ファイルは最終的にブラウザ上に表示され、php バッファ=》Web サーバー バッファ=》ブラウザ バッファという 3 つのバッファリング段階を経ます。 最後にブラウザに表示されました
デフォルトではphpバッファがオンになっており、バッファのデフォルト値は4096、つまり4kbです。 Output_buffering 設定は php.ini 設定ファイルにあります。バッファはメモリ アドレス空間であり、Linux システムのデフォルト サイズは通常 4096 (4kb) で、これは 1 メモリ ページです。主に、速度が同期していないデバイスや優先度が異なるデバイス間のデータ転送領域を格納するために使用されます。バッファーを介して、プロセスは相互に待機する時間を減らすことができます。次に、より一般的な例を示します。ファイルを編集するためにテキスト エディタを開いた場合、文字を入力するたびに、オペレーティング システムはその文字をすぐにディスクに直接書き込むのではなく、書き込み時に最初にその文字をバッファに書き込みます。バッファがいっぱいの場合、バッファ内のデータはディスクに書き込まれます。もちろん、カーネル関数 flash() が呼び出されるときは、バッファ内のダーティ データをディスクに書き戻す必要があります。
たとえば、
<?php echo "南无阿弥陀佛<br>"; header("content-type:text/html;charset='utf-8'"); echo "真善忍好!"; //output //南无阿弥陀佛 //真善忍好
header()は、実際の出力の前に呼び出す必要がありますが、プログラムはすでに出力されていますが、正常に実行されます。次のコードを見ると:
<?phpecho "南无阿弥陀佛<br>"; ob_flush(); header("content-type:text/html;charset='utf-8'"); echo "真善忍好!"; //output //南无阿弥陀佛 //Cannot modify header information - headers already sent by (output started at E:\php\test.php:3) //真善忍好
上記のプログラムは、プログラムがすぐには出力せず、ob_flush 関数が呼び出されたときにのみバッファーをリフレッシュして出力することを示しています。
ob_flush() と flash()
ob_flush() と flash() 関数については、PHP マニュアルで詳しく説明されていますので、確認してください。 2 つの違いは次のとおりです。
ob_flush() は PHP 自体のバッファをリフレッシュします。
flush() は WebServer サーバーのバッファをリフレッシュします。ブラウザに出力します。 しかし、次の状況が発生します:
個々の Web サーバー プログラム、特に Win32 での Web サーバー プログラムは、結果をブラウザーに送信する前に、プログラムの終了までスクリプトの出力をキャッシュします。
mod_gzip などの一部の Apache モジュールは、独自の出力をキャッシュする場合があるため、flush() 関数によって生成された結果がクライアントのブラウザーにすぐに送信されなくなります。
ブラウザでも、受信したコンテンツを表示する前にキャッシュします。たとえば、Netscape ブラウザは、改行または HTML タグの先頭を受け取るまでコンテンツをキャッシュし、 タグを受け取るまでテーブル全体を表示しません。
Microsoft Internet Explorer の一部のバージョンは、256 バイトを受信した後にのみページの表示を開始するため、これらのブラウザーがページのコンテンツを表示できるようにするには、追加のスペースを送信する必要があります。
例:
<?php /** Server:LightTPD/1.4.28 (Win32) X-Powered-By:PHP/5.3.27 */ echo '佛法无边'."<BR>"; ob_flush(); flush(); sleep(1); echo '法轮常转'; //output
上記のコードは、Chrome ブラウザでは 1 行ずつ出力されますが、IE シリーズ ブラウザではすべて出力されます。実際、これは上の 4 番目の項目です。一部のブラウザでは、256 文字を受信した場合にのみ表示が開始されます。上記のコードを次の形式に変更します:
<?php /** Server:LightTPD/1.4.28 (Win32) X-Powered-By:PHP/5.3.27 */ echo str_pad('',240)."\n"; echo '佛法无边'."<BR>"; ob_flush(); flush(); sleep(1); echo '法轮常转'; //output
このようにすると、256 文字を超えるため、IE では 1 行ずつ出力されます。
ob その他の関数の説明
1. ob_end_flush と ob_end_clean
名前が示すように、end はバッファを閉じ、どちらも出力バッファを閉じます。1 つは出力バッファ、もう 1 つはクリアです。たとえば、
<?php /** Server:LightTPD/1.4.28 (Win32) X-Powered-By:PHP/5.3.27 */ echo 'before'; ob_end_clean(); echo str_pad('',4096)."\n"; for ($i=10; $i>0; $i--) { echo $i; sleep(1); }
上記のコードは、コンテンツを 1 つずつ出力するのではなく、一度に全体を出力します。 ob_end_clean() はバッファをオフにしませんか?それらを 1 つずつ出力しないのはなぜでしょうか? 実際、上で述べたように、php はブラウザーに直接出力されるのではなく、Web サーバーに出力されます。 phpにはバッファがありませんが。ただし、Web サーバーはまだ存在します。したがって、次のコード:
/** Server:LightTPD/1.4.28 (Win32) X-Powered-By:PHP/5.3.27 */ echo 'before'; ob_end_clean(); echo str_pad('',4096)."\n"; for ($i=10; $i>0; $i--) { flush(); echo $i; sleep(1); }
にflush()を追加すると、行ごとに出力されます。 ob_end_clean を ob_end_flush に置き換えると、 before が出力されます。
その他の機能はマニュアルを参照でき、比較的簡単です。
まとめ
PHPスクリプトからブラウザへは、PHPバッファ=》Webサーバーバッファ=》ブラウザバッファを経由する必要があります。 最後にブラウザに表示されました。 不可欠です。 したがって、必要なエフェクトをデバッグするには、ob_flush と flash を追加し、echo str_pad('',4096) を追加する必要があります。
要約: 以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。
関連する推奨事項:
PHPでのcall_user_func_arrayコールバック関数の使い方
以上がPHP出力バッファ制御の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。