##################################### ##タイトル 出力バッファリングに関するディスカッション# #organizeDiegoLynn@林国##原著 Zeev Suraski 著 #################################### #### 成果に関するディスカッションバッファリング (出力バッファリング) 目次 HTTP ヘッダー 出力バッファリング テクノロジを使用する理由 出力バッファリングの仕組み 基本的な使用方法 高度な使用法により作業が簡素化されます ハハ、個人的には、出力バッファリングは比較的純粋な機能だと思います。概念的には非常に単純ですが、出力バッファリングは非常に強力であり、開発者は高度で効率的なプログラムを開発しやすくなります。 この記事では、HTTP ヘッダー、出力バッファリングが HTTP ヘッダーの処理にどのように役立つか、および出力バッファリングの高度な使用法をいくつか紹介します。 HTTP ヘッダー [HTTP ヘッダー] HTTP プロトコルを使用して確立されたすべてのリクエストに対して、Web サーバーによって生成される応答は通常、ヘッダーと本文の 2 つの部分で構成されます。たとえば、Web サーバーのドキュメント ルート ディレクトリに example.txt という小さなテキスト ファイルがあり、そのファイルに「Hello, world!」というテキストが含まれている場合、このファイルに対する HTTP リクエストの応答は次のようになります。 1.1 200 OK 日付: Sat, 02 Sep 2000 21:40:08 GMT Server: Apache/1.3.11 (Unix) mod_macro/1.1.1 PHP/4.0.2-dev Last-Modified: Sat, 02 Sep 2000 21:39 :49 GMT ETag: "12600b-e-39b173a5" Accept-Ranges: bytes Content-Length: 14 Connection: close Content-Type: text/plain Hello, world! このリクエストの最初の部分 (つまり、大部分) HTTPヘッダーです。 HTTP ヘッダーはブラウザーのユーザーには表示されませんが、文書のコンテンツ タイプ、使用されているプロトコルのバージョン、文書の最終変更日などのブラウザー用の情報が含まれています。 HTTP ヘッダーには多くの規則はありません。通常、その形式は次のとおりです。 フィールド: 値[フィールド: 値] 文書本体と空白行で区切る必要があります。 この HTTP ヘッダーの情報は、PHP スクリプトから追加または変更できます。たとえば、 header() 関数を使用できます。 header("Location: http://www.php.net/"); // http://www.php.net/ にリダイレクトします。 SetCookie を使用することもできます。 () function: SetCookie("foo", "bar"); HTTP Cookie が HTTP ヘッダーを使用して実装されていることはご存知かもしれません。たとえば、次の PHP ファイルに対する HTTP リクエスト応答 は次のようになります: HTTP/1.1 200 OK Date: Sat, 02 Sep 2000 21:43:02 GMT Server: Apache/1.3.11 (Unix) mod_macro/1.1。 1 PHP /4.0.2-dev X-Powered-By: PHP/4.0.2-dev Set-Cookie: foo=bar Connection: close Content-Type: text/html ブラウザは、Cookie から返された HTTP ヘッダーを読み取ります。サーバーでは、foo という名前の Cookie (この場合はセッション Cookie) が送信され、その値が bar であることがわかります。 出力バッファリング テクノロジを使用する理由 出力バッファリング テクノロジの必要性は、PHP/FI 2.0 の時点で明らかでした。このバージョンの PHP を使用したことがある場合は、「おっと、ヘッダーの送信後に SetCookie が呼び出されました」というエラー メッセージが頻繁に表示され、原因は何だったのか頭を悩ませたことをまだ覚えているかもしれません。 PHP の最新バージョン (PHP 3.0 または PHP 4.0) を使用したことがある場合は、次のエラー メッセージをご存知でしょう。「おっと、ヘッダーが送信された後に php_set_cookie が呼び出されました。」あるいは、PHP の header() 関数を呼び出そうとすると、「ヘッダー情報を追加できません - ヘッダーはすでに送信されました」というメッセージが表示される場合があります。一般に、出力バッファリング テクノロジのユーザーはこれらの煩わしいエラー メッセージを回避しますが、開発者はこれを高度な目的に使用することもできます。 これらのエラーはいつ発生しましたか?これらのエラー メッセージは、HTTP ヘッダーの送信後にヘッダー情報を追加または変更しようとした場合、およびドキュメント本文とヘッダーの間に空白行がない場合に発生する可能性があります。これがどのように起こるかを理解するために、PHP が HTTP ヘッダー出力と本文出力をどのように処理するかを見てみましょう。 スクリプトの実行が開始されると、ヘッダー情報と本文情報を同時に送信できます。ヘッダー情報 (header() または SetCookie() 関数から) はすぐには送信されず、リストに保存されます。 これにより、デフォルトのヘッダー (Content-Type ヘッダーなど) を含むヘッダー情報を変更できます。ただし、スクリプトがヘッダー以外の出力を送信すると (たとえば、HTML ブロックまたは print() 呼び出しを使用して)、PHP は最初にすべてのヘッダーを送信し、次に空行を送信し、HTTP ヘッダーを終了してから、メインデータは引き続き送信されます。これ以降、ヘッダー情報を追加または変更しようとする試みは許可されず、上記のエラー メッセージのいずれかが送信されます。 これは大きな問題を引き起こしませんが、場合によっては、入力を送信する前に HTTP ヘッダーを終了することにより、スクリプト ロジックが複雑になるだけです。出力バッファリング技術はこれらの問題を解決できます。出力バッファリングの仕組み 出力バッファリングが有効になっている場合、スクリプトが出力を送信するときに PHP は HTTP ヘッダーを送信しません。代わりに、この出力を動的に増加するキャッシュにパイプ処理します (集中出力メカニズムを持つ PHP 4.0 でのみ使用可能)。ヘッダーは実際には送信されないため、ヘッダー行の変更、追加、または Cookie の設定を行うことができます。最も単純なケースでは、スクリプトが終了すると、PHP は自動的に HTTP ヘッダーをブラウザーに送信し、出力バッファーの内容を送信します。それは簡単です。 基本的な使用法 次の 4 つの関数を使用すると、出力バッファリングの制御に役立ちます。 ob_start() は、出力バッファリング メカニズムを有効にします。出力バッファリングは複数のレベルをサポートします。たとえば、ob_start() 関数は複数回呼び出すことができます。 ob_end_flush() は出力バッファ (出力バッファ) を送信し、出力バッファリング メカニズムを無効にします。 ob_end_clean() は出力バッファを送信せずにクリアし、出力バッファリングを無効にします。 ob_get_contents() は、現在の出力バッファを文字列として返します。スクリプトによって出力された出力を処理できます。 さらに、php.ini の Output_buffering ディレクティブを有効にすることもできます。このディレクティブが有効な場合、各 PHP スクリプトは最初に ob_start() 関数を呼び出すことと同じになります。例 1