ホームページ > バックエンド開発 > PHPチュートリアル > PHP出力バッファ制御の詳細説明

PHP出力バッファ制御の詳細説明

墨辰丷
リリース: 2023-03-29 08:12:02
オリジナル
1573 人が閲覧しました

この記事では、主に 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=&#39;utf-8&#39;");
echo "真善忍好!";
//output
//南无阿弥陀佛
//真善忍好
ログイン後にコピー

header()は、実際の出力の前に呼び出す必要がありますが、プログラムはすでに出力されていますが、正常に実行されます。次のコードを見ると:

<?phpecho "南无阿弥陀佛<br>";
ob_flush();
header("content-type:text/html;charset=&#39;utf-8&#39;");
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 サーバーのバッファをリフレッシュします。ブラウザに出力します。 しかし、次の状況が発生します:

  1. 個々の Web サーバー プログラム、特に Win32 での Web サーバー プログラムは、結果をブラウザーに送信する前に、プログラムの終了までスクリプトの出力をキャッシュします。

  2. mod_gzip などの一部の Apache モジュールは、独自の出力をキャッシュする場合があるため、flush() 関数によって生成された結果がクライアントのブラウザーにすぐに送信されなくなります。

  3. ブラウザでも、受信したコンテンツを表示する前にキャッシュします。たとえば、Netscape ブラウザは、改行または HTML タグの先頭を受け取るまでコンテンツをキャッシュし、 タグを受け取るまでテーブル全体を表示しません。

  4. Microsoft Internet Explorer の一部のバージョンは、256 バイトを受信した後にのみページの表示を開始するため、これらのブラウザーがページのコンテンツを表示できるようにするには、追加のスペースを送信する必要があります。

例:

<?php
/**
Server:LightTPD/1.4.28 (Win32)
X-Powered-By:PHP/5.3.27
*/
echo &#39;佛法无边&#39;."<BR>";
ob_flush();
flush();
sleep(1);
echo &#39;法轮常转&#39;;

//output
ログイン後にコピー

上記のコードは、Chrome ブラウザでは 1 行ずつ出力されますが、IE シリーズ ブラウザではすべて出力されます。実際、これは上の 4 番目の項目です。一部のブラウザでは、256 文字を受信した場合にのみ表示が開始されます。上記のコードを次の形式に変更します:

<?php
/**
Server:LightTPD/1.4.28 (Win32)
X-Powered-By:PHP/5.3.27
*/
echo str_pad(&#39;&#39;,240)."\n"; 
echo &#39;佛法无边&#39;."<BR>";
ob_flush();
flush();
sleep(1);
echo &#39;法轮常转&#39;;

//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 &#39;before&#39;;
ob_end_clean();
echo str_pad(&#39;&#39;,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 &#39;before&#39;;
ob_end_clean();
echo str_pad(&#39;&#39;,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で実装されたログイン、登録、パスワード変更機能

PHPの匿名関数の詳しい解説と注意点

PHPでのcall_user_func_arrayコールバック関数の使い方

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート