ホームページ >バックエンド開発 >PHPチュートリアル >PHP出力バッファ制御(Output Control)概要

PHP出力バッファ制御(Output Control)概要

伊谢尔伦
伊谢尔伦オリジナル
2016-11-25 13:38:511192ブラウズ

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() は実際の出力の前に呼び出す必要がありますが、プログラムはすでに出力されていますが、正常に実行されます。以下のコードを見ると:

<?php
echo "南无阿弥陀佛<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() とlush()

ob_flush() とflush() 関数については、PHP マニュアルで詳しく説明されていますので、確認してください。 2 つの違いは次のとおりです。

ob_flush() は PHP 自体のバッファをリフレッシュします。

flush() は WebServer サーバーのバッファをリフレッシュします。ブラウザに出力します。ただし、次の状況が発生します:

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

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

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

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 は、その名前が示すように、両方とも出力バッファーを閉じます。たとえば、

<?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 buffer=》web server buffer=》browser buffer。 最后显示到浏览器。 缺一不可。 所以我们要 ob_flush 和  flush 以及加上  echo str_pad(”,4096) 才能调试出你想要的效果。


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