ホームページ  >  記事  >  php教程  >  PHPのflush()とob_flush()の違いの詳しい説明

PHPのflush()とob_flush()の違いの詳しい説明

高洛峰
高洛峰オリジナル
2016-12-22 16:29:031118ブラウズ

uffer ---- flash()

buffer はメモリ アドレス空間で、Linux システムのデフォルト サイズは通常 4096 (1kb) で、これは 1 メモリ ページです。主に、速度が同期していないデバイス間や優先度の異なるデバイス間でのデータ転送領域を格納するために使用されます。バッファーを介して、プロセスは相互に待機する時間を減らすことができます。次に、より一般的な例を示します。ファイルを編集するためにテキスト エディタを開いた場合、文字を入力するたびに、オペレーティング システムはその文字をすぐにディスクに直接書き込むのではなく、書き込み時に最初にその文字をバッファに書き込みます。バッファがいっぱいの場合、バッファ内のデータはディスクに書き込まれます。もちろん、カーネル関数 flash() が呼び出されるときは、バッファ内のダーティ データをディスクに書き戻す必要があります。
同様に、echo と print が実行されると、出力は表示のために tcp 経由でクライアントのブラウザにすぐに送信されませんが、データは php バッファーに書き込まれます。 phpのoutput_bufferingメカニズムは、tcpバッファの前に新しいキューが確立され、データがそのキューを通過する必要があることを意味します。 PHP バッファーがいっぱいになると、スクリプト プロセスは PHP バッファー内の出力データをシステム カーネルに渡し、表示のために TCP 経由でブラウザーに渡します。したがって、データは、echo/pring -> php バッファ -> tcp バッファ -> ブラウザ

php out_buffering --- ob_flush()

デフォルトでは、php バッファがオンになっています。このバッファのデフォルト値は 4096、つまり 1kb です。 Output_buffering 設定は php.ini 設定ファイルにあります。echo、print などでユーザー データを出力すると、output_buffering がいっぱいになるまで、データは php の out_buffering に書き込まれます。 。 見せる。 ob_start() を使用して php の出力バッファリングメカニズムを手動でアクティブにすることもできます。これにより、出力が 1kb のデータを超えた場合でも、ob_start() が php バッファスペースを次のように設定するため、データは実際には tcp に渡されず、ブラウザに渡されます。十分な大きさであること。スクリプトが終了するか、ob_end_flush 関数が呼び出されるまで、データはクライアント ブラウザに送信されません。

おそらく多くの人にとって、これら 2 つの機能の使用法が最も混乱する問題です。マニュアルの 2 つの機能の説明も不明瞭で、両方の機能の違いが明確に指摘されていないようです。出力キャッシュを更新します。しかし、記事の冒頭のコードで、flush() が ob_flush() に置き換えられると、プログラムは正しく実行されなくなります。明らかに、それらの間に違いがあります。そうでない場合は、それらの一方が別の関数のエイリアスであることをマニュアルに直接記載するだけで十分です。それらを個別に説明する必要はありません。それでは、それらの違いは何でしょうか?

キャッシュが有効になっていない場合、サーバー側でスクリプトで出力した出力待ちのコンテンツをflush()で即座にクライアントに送信することができます。

キャッシュがオンになった後、スクリプトによって出力されたコンテンツは出力キャッシュに保存されます。この時点で、flush() を直接使用した場合、コンテンツはクライアントに送信されません。 。 ob_flush() の機能は、もともと出力キャッシュに存在していたコンテンツを取り出して出力待ち状態に設定することですが、この場合、最初に ob_flush() を使用する必要があります。その後、flush() を実行すると、クライアントはスクリプトの出力をすぐに取得できます。

1. フラッシュと ob_flush の正しい順序は、次のように最初に ob_flush、次にフラッシュです:
ob_flush();
flush();
Web サーバーのオペレーティング システムが Windows システムの場合は、順序を逆にするか、次のようにします。 ob_flush( ) を使用しなくても問題は発生しません。 [要検証] ただし、Linux システムでは出力バッファをリフレッシュできません。

出力バッファリング関数
1.bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )
output_buffering メカニズムをアクティブにします。アクティブ化すると、スクリプト出力はブラウザに直接送信されなくなり、一時的に PHP バッファ メモリ領域に書き込まれます。
phpはデフォルトでoutput_bufferingメカニズムを有効にしますが、ob_start()関数を呼び出すことにより、データのoutput_buffering値が十分に大きな値に拡張されます。 $chunk_size を指定して、output_buffering の値を指定することもできます。 $chunk_size のデフォルト値は 0 です。これは、スクリプトが終了するまで php バッファー内のデータがブラウザーに送信されないことを意味します。 $chunk_size のサイズを設定すると、バッファ内のデータ長がこの値に達する限り、バッファ内のデータがブラウザに送信されることを意味します。
もちろん$ouput_callbackを指定することでバッファ内のデータを処理することもできます。たとえば、関数 ob_gzhandler はバッファ内のデータを圧縮してブラウザに送信します。
3 番目のパラメータ: キャッシュをクリアするかどうか。オプション。デフォルトは true です。false に設定すると、スクリプトの実行が終了する前にキャッシュはクリアされません。
2.ob_get_contents
PHP バッファ内のデータのコピーを取得します。 ob_end_clean() 関数が呼び出される前にこの関数を呼び出す必要があることに注意してください。そうしないと、ob_get_contents() は null 文字を返します。

ob_get_contents() を使用すると、サーバーによってキャッシュされたデータを文字列の形式で取得できます。
ob_end_flush() を使用すると、キャッシュされたデータが出力され、キャッシュが閉じられます。
ob_end_clean() を使用すると、データやその他のアクションを行わずに、サーバーにキャッシュされたデータがサイレントに消去されます。
サーバー上のキャッシュはスタックされています。つまり、ob_start() を有効にした後、それを閉じる前に、その中にある別のキャッシュ ob_start() を開くことができます。

ただし、キャッシュをオフにする操作の数が、キャッシュをオンにする操作の数と同じであることも確認する必要があります。
ob_start() は、キャッシュされたデータを処理するコールバック関数を指定できます。1 つの ob_start() が別の ob_start() 内にネストされている場合、外側の ob_start() の番号は A であり、内側の ob_start() の番号は であると想定されます。 B. それぞれにコールバック関数 functionA と functionB があります。キャッシュ B 内のデータが出力されると、最初に funcitonB コールバック関数によって処理され、次に処理のために外側の functionA コールバック関数に渡されます。クライアント側に出力できます。

さらに、マニュアルには、Apache などの一部の Web サーバーでは、コールバック関数を使用すると、プログラムの現在の作業ディレクトリが変更される可能性があると記載されています。解決策は、chdir を使用して、コールバック関数で作業ディレクトリを手動で変更することです。このドットは頻繁に発生するものではないようなので、遭遇した場合は必ずマニュアルを確認してください。

3. ob_end_flush と ob_end_clean
これら 2 つの関数は似ており、両方とも ouptu_buffering メカニズムをオフにします。ただし、違いは、ob_end_flush は php バッファー内のデータをクライアント ブラウザーにフラッシュ (フラッシュ/送信) するだけですが、ob_clean_clean は php バッファー内のデータをクリア (消去) しますが、クライアント ブラウザーには送信しないことです。

ob_end_flush が呼び出される前は、php バッファー内のデータはまだ存在しており、ob_get_contents() は引き続き php バッファー内のデータのコピーを取得できます。

ob_end_flush() を呼び出した後、ob_get_contents() は空の文字列を取得し、ブラウザーは出力を受け取ることができません。つまり、出力はありません。

ob_get_contents() を使用してサーバー側のキャッシュされたデータを文字列の形式で取得し、 ob_end_flush() を使用してキャッシュされたデータを出力し、キャッシュを閉じることができます。
ob_end_clean() を使用すると、データやその他のアクションを行わずに、サーバーにキャッシュされたデータがサイレントに消去されます。
サーバー上のキャッシュはスタックされています。つまり、ob_start() を有効にした後、それを閉じる前に、その中にある別のキャッシュ ob_start() を開くことができます。ただし、キャッシュをオンにする操作と同じ数のキャッシュをオフにする操作があることも確認する必要があります。
ob_start() は、キャッシュされたデータを処理するコールバック関数を指定できます。1 つの ob_start() が別の ob_start() 内にネストされている場合、外側の ob_start() の番号は A であり、内側の ob_start() の番号は であると想定されます。 B. それぞれにコールバック関数 functionA と functionB があります。キャッシュ B 内のデータが出力されると、最初に funcitonB コールバック関数によって処理され、次に処理のために外側の functionA コールバック関数に渡されます。クライアント側に出力できます。

さらに、マニュアルには、Apache などの一部の Web サーバーでは、コールバック関数を使用すると、プログラムの現在の作業ディレクトリが変更される可能性があると記載されています。解決策は、chdir を使用して、コールバック関数で作業ディレクトリを手動で変更することです。このドットは頻繁に発生するものではないようなので、遭遇した場合は必ずマニュアルを確認してください。


PHP flash() と ob_flush() の違いの詳細な説明については、PHP 中国語 Web サイトに注目してください。


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