ホームページ  >  記事  >  バックエンド開発  >  PHPでの出力バッファのリフレッシュの詳細な説明

PHPでの出力バッファのリフレッシュの詳細な説明

不言
不言オリジナル
2018-04-23 10:18:081663ブラウズ

この記事の主な内容は、PHP での出力バッファーのリフレッシュについての詳細な説明です。必要な方は参考にしてください。バッファーはメモリ アドレス空間です。 Linux システムのデフォルトのサイズは平均 4096 (1kb) で、これは 1 メモリ ページです。主に、速度が同期していないデバイスや優先度が異なるデバイス間のデータ転送領域を格納するために使用されます。バッファーを介して、プロセスは相互に待機する時間を減らすことができます。次に、より一般的な例を示します。ファイルを編集するためにテキスト エディタを開いた場合、文字を入力するたびに、オペレーティング システムはその文字をすぐにディスクに直接書き込むのではなく、書き込み時に最初にその文字をバッファに書き込みます。バッファがいっぱいの場合、バッファ内のデータはディスクに書き込まれます。もちろん、カーネル関数 flash() が呼び出されるときは、バッファ内のダーティ データをディスクに書き戻す必要があります。

同様に、PHP では、echo と print が実行されると、出力は tcp 経由で表示するためにクライアントのブラウザーにすぐに送信されませんが、データは php バッファーに書き込まれます。 phpのoutput_bufferingメカニズムは、tcpバッファの前に新しいキューが確立され、データがそのキューを通過する必要があることを意味します。 PHP バッファーがいっぱいになると、スクリプト プロセスは PHP バッファー内の出力データをシステム カーネルに渡し、表示のために TCP 経由でブラウザーに渡します。したがって、データは echo/pring -> php バッファ -> tcp バッファ -> ブラウザの順に書き込まれます

PHP にはバッファの更新に関連する関数が 3 つあります。
1). フラッシュ PHP が実行される状況に関係なく、PHP プログラムのバッファをリフレッシュします。この関数は、これまでのプログラムの出力をすべてユーザーのブラウザに送信します。 ただし、この関数はサーバーまたはクライアントのブラウザーのキャッシュ モードに影響を与えず、また PHP 自体のキャッシュにも影響を与えません。

2).ob_flush

この関数はPHP自体のキャッシュを出力します。 PHP 自体のキャッシュは、php.ini の
output_buffering

によって制御されます。 ob_flush() の機能は、元々出力キャッシュに格納されていたコンテンツを取り出して出力待機状態に設定することですが、この場合、最初に ob_flush() を使用する必要があります。次に、flush() を実行すると、クライアントはスクリプトの出力をすぐに取得します。

PHP 自体の出力バッファリングに関連する 2 つの PHP 設定は次のとおりです: パラメーター 1:

output_buffering

: on/off または整数。オンに設定すると、出力キャッシュ コントロールはキャッシュのサイズを制限せずにすべてのスクリプトで使用されます。 Output_buffering=4096 などの整数に設定すると、キャッシュ データが 4096 バイトに達すると、キャッシュが自動的に出力され、更新されます。このパラメータの違いが、上記のコードの実行結果が異なるタイミングで異なる理由です。 Output_buffering がオフになっている場合、スクリプトのすべての出力 (エコー) は、上記のコードが実行されるとすぐにクライアントに送信され、1 秒ごとに数値が出力されます。 Output_buffering をオンにすると、出力コンテンツは最初にサーバーにキャッシュされ、スクリプトが終了するまでクライアントに送信されません。 パラメータ 2: implicit_flush

: オン/オフ。 ON に設定すると、スクリプトが出力されるとすぐに自動的にクライアントに送信されます。これは、echo の後に flash() を自動的に追加するのと同じです。


3).ob_implicit_flush
この関数は、出力があるたびに出力を即座にブラウザーに送信するように強制します。この方法では、各出力 (エコー) の後にフラッシュ() を使用してブラウザに送信する必要はありません。

以下は例です:



[php]プレーンを表示コピー



  1. <?php  
    ob_end_clean();  
    echo str_pad(" ", 256);  
    for ($i=100; $i>0; $i--) {  
       echo $i, &#39;<br/>&#39;;  
       flush();  
       sleep(1);   
    }   
    ?>

上記のコードは $i を 1 秒ごとに出力するはずです。 (" ", 256) の目的は、IE が表示を開始する前に 256 バイトを受信する必要があることです。 上記のコードは、次の 2 つの方法で記述することもできます。





[php]プレーンに表示コピー



    りー




[php] view plain copy



    <?php  
    echo str_pad(" ", 256);  
    for ($i=100; $i>0; $i--) {  
       echo $i, &#39;<br />&#39;;  
       ob_flush();  
       flush();  
       sleep(1);   
    }   
    ?>


バッファの影響を受ける上記の側面に加えて、次の影響も受けます:


1). 一部の Web サーバー プログラム、特に Win32 での Web サーバー プログラムは、結果をブラウザーに送信する前に、プログラムの終了までスクリプトの出力をキャッシュします。 mod_gzip などの一部の Apache モジュールは、出力キャッシュを自ら実行する場合があるため、flush() 関数によって生成された結果がクライアントのブラウザにすぐに送信されなくなります。ブラウザでも、受信したコンテンツを表示する前にキャッシュします。たとえば、Netscape ブラウザは、改行または HTML タグの先頭を受け取るまでコンテンツをキャッシュし、f16b1740fad44fb09bfe928bcc527e08 タグを受け取るまでテーブル全体を表示しません。 Microsoft Internet Explorer の一部のバージョンでは、256 バイトを受信した後にのみページの表示が開始されるため、これらのブラウザでページのコンテンツを表示するには、追加のスペースを送信する必要があります。

2) PHP インストール モードの影響。上記の方法は、PHP が Apache モジュールとしてインストールされている場合に直接使用できます。 FastCgi を使用する場合は、次の設定に注意する必要があります:

a). Apache+Fcgid+PHP
FcgidOutputBufferSize 0 (デフォルトは 65536)

Fcgid を設定するときは、この値を 0 に設定します。目的の効果を達成するためのリフレッシュ バッファー時間。

b).IIS+FastCgi+PHP

ResponseBufferLimit=0

WINDOWSsystem32inetsrvfcgiext.ini の下のこの項目を変更します。

c).nginx+php-fpm

fastcgi_buffer_size 4k;fastcgi_buffer_size 4k;

        fastcgi_buffers 8 4k;<br>        fastcgi_busy_buffers_size 4k<br>

        gzip off;

相关推荐:

<a href="http://www.php.cn/php-weizijiaocheng-384170.html" target="_self">详解通过刷新PHP缓冲区为你的站点加速</a>

fastcgi_buffers 8 4k;<span class="content" style="margin:0px;padding:0px;"> fastcgi_busy_buffers_size 4k<span class="block" style="margin:0px;padding:0px;"></span></span>

🎜🎜gzip オフ;🎜🎜🎜🎜🎜🎜関連する推奨事項:🎜🎜🎜🎜🎜🎜<a href="http://www.php.cn/php-weizijiaocheng-384170.html" target="_self">PHP バッファを更新してサイトを高速化する方法の詳細な説明 a>🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜</a>

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

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