ホームページ > バックエンド開発 > PHPチュートリアル > PHPのflush()関数とob_flush()関数の使用法の違いの詳細な説明

PHPのflush()関数とob_flush()関数の使用法の違いの詳細な説明

伊谢尔伦
リリース: 2023-03-11 10:04:02
オリジナル
1283 人が閲覧しました

1. buffer ---- flash()

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


2. デフォルトでは、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()を直接使用した場合、コンテンツは送信されません。クライアントに。 ob_flush() の機能は、元々出力キャッシュに格納されていたコンテンツを取り出して出力待機状態に設定することですが、この場合、最初に ob_flush() を使用する必要があります。その後、 flash() を実行すると、クライアントはスクリプトの出力をすぐに取得できます。

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

4. 出力バッファリング関数
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_g​​zhandler はバッファ内のデータを圧縮してブラウザに送信します。
3 番目のパラメータ: キャッシュをクリアするかどうか。オプション。デフォルトは true です。false に設定すると、スクリプトの実行が終了する前にキャッシュはクリアされません。
ob_g​​et_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 を使用して、コールバック関数で作業ディレクトリを手動で変更することです。このドットは頻繁に発生するものではないようなので、遭遇した場合は必ずマニュアルを確認してください。

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のflush()関数とob_flush()関数の使用法の違いの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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