PHP 出力バッファ制御 (出力制御) Learning_PHP チュートリアル
- WBOYオリジナル
- 2016-07-13 10:11:30895ブラウズ
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() が呼び出されるときは、バッファ内のダーティ データをディスクに書き戻すことが必須です。
例を挙げてください
エコー「南無阿弥陀仏」;
header("content-type:text/html;charset='utf-8'");
エコー「真実、慈悲、忍耐は良いことです!」;
//出力
//南無阿弥陀仏
//真実・慈悲・忍耐は良いことです
header() は実際の出力の前に呼び出す必要がありますが、プログラムはすでに出力されていますが、正常に実行されます。以下のコードを見てください:
エコー「南無阿弥陀仏」;
ob_flush();
header("content-type:text/html;charset='utf-8'");
エコー「真実、慈悲、忍耐は良いことです!」;
//出力
//南無阿弥陀仏
//ヘッダー情報は変更できません - ヘッダーはすでに送信されています (出力は E:phptest.php:3 で開始されました)
//真実・慈悲・忍耐は良いことです
上記のプログラムは、プログラムがすぐには出力せず、ob_flush 関数が呼び出されたときにのみバッファーをリフレッシュして出力することを示しています。
ob_flush() と flash()
ob_flush()、flush() 関数の詳細な手順は PHP マニュアルに記載されているので、確認してください。 2 つの違いは次のとおりです:
ob_flush() は PHP 自身のバッファをリフレッシュするためのものです
flush() はい WebServer サーバーのバッファを更新します。ブラウザに出力します。ただし、次のような状況が発生します:
一部の Web サーバー プログラム、特に Win32 下のプログラムは、結果をブラウザーに送信する前に、プログラムの終了までスクリプトの出力をキャッシュします。
mod_gzip などの一部の Apache モジュールは、独自の出力をキャッシュする場合があり、これにより、flush() 関数によって生成された結果がクライアントのブラウザーにすぐに送信されなくなります。
ブラウザでも、受信したコンテンツを表示する前にキャッシュします。たとえば、Netscape ブラウザは、改行または HTML タグの先頭を受け取る前にコンテンツをキャッシュし、
を受け取った後にコンテンツをキャッシュします。
マークを付けると、表全体が表示されません。
Microsoft Internet Explorer の一部のバージョンでは、256 バイトを受信した後にのみページの表示が開始されるため、これらのブラウザを許可するには追加のスペースを送信する必要があります
ページのコンテンツを表示します。
例:
/**
サーバー:LightTPD/1.4.28 (Win32)
X-Powered-By:PHP/5.3.27
*/
エコー「ダルマは無限です」。"
";
ob_flush();
フラッシュ();
睡眠(1);
エコー「法の輪は常に回転する」;
//出力
上記のコードはChromeブラウザでは一行ずつ出力しますが、IEシリーズブラウザでは全て出力します。実際には、上の 4 番目の項目ですが、一部のブラウザでは 256 個しか受信できません。
文字が表示され始めます。上記のコードを次の形式に変更します:
/**
サーバー:LightTPD/1.4.28 (Win32)
X-Powered-By:PHP/5.3.27
*/
echo str_pad('',240)."n";
エコー「ダルマは無限です」。"
";
ob_flush();
フラッシュ();
睡眠(1);
エコー「法の輪は常に回転する」;
//出力
このようにIEでは256文字を超えるため一行ずつ出力されます。
その他の機能の説明
1.ob_end_flush と ob_end_clean
名前のとおり、終了はバッファを閉じます。どちらも出力バッファを閉じます。1 つは出力バッファ、もう 1 つはクリアです。たとえば
/**
サーバー:LightTPD/1.4.28 (Win32)
X-Powered-By:PHP/5.3.27
*/
エコー「前」;
ob_end_clean();
echo str_pad('',4096)."n";
for ($i=10; $i>0; $i--)
{
$i をエコー;
睡眠(1);
}
上記のコードは、コンテンツを 1 つずつ出力するのではなく、すべてのコンテンツを一度に出力します。 ob_end_clean() はバッファをオフにしませんか?それらを 1 つずつ出力してみませんか? 実際、上でも言いました
phpはブラウザに直接出力されるのではなく、Webサーバーに出力されます。 phpにはバッファリングがありませんが。ただし、Web サーバーはまだ存在します。したがって、次のコード:
/**
サーバー:LightTPD/1.4.28 (Win32)
X-Powered-By:PHP/5.3.27
*/
エコー「前」;
ob_end_clean();
echo str_pad('',4096)."n";
for ($i=10; $i>0; $i--)
{
フラッシュ();
$i をエコー;
睡眠(1);
}
flush()を追加すると一行ずつ出力されます。 ob_end_clean を ob_end_flush に置き換えると、before が出力されます。
その他の機能はマニュアルを参照できますが、比較的簡単です。
まとめ
PHP スクリプトからブラウザへは、PHP バッファ=》Web サーバー バッファ=》ブラウザ バッファを経由する必要があります。 最後にブラウザに表示されました。 不可欠です。 だから私たちは
しなければなりません
ob_flush、flush、echo str_pad('',4096) を使用して、必要なエフェクトをデバッグできます。
http://www.bkjia.com/PHPjc/928279.htmlwww.bkjia.com本当http://www.bkjia.com/PHPjc/928279.html技術記事 PHP 出力制御 (出力制御) PHP バッファリングの学習 入門 実は、PHP ob シリーズに対する印象はまだ非常に漠然としていて、普段カードを使っているのでよく知っています。 ...