崖っぷちの男

たぶん技術っぽいネタ。ブログ名が決められない

output_buffering と output_handler

今日は PHP の設定に関することで初めて知ったことがあったのでそれをちょっと書くだけにします。


PHP で HTML を出力したあとで setcookie() しようとしたとき、デフォルト設定だと何もエラーが出ないことがあります。でも、マニュアルにもあるように本来は HTML 出力する前に setcookie() をすべきなので、そうなっていないときはエラーを表示してほしいなという時があります。

setcookie() は、その他のヘッダ情報と共に 送信するクッキーを定義します。 ほかのヘッダ情報と同様に、 クッキーは、スクリプトによる他のあらゆる出力よりも前に 送信される必要があります(これはHTTPプロトコルの制約です)。

PHP: setcookie - Manual


でエラーが出ないのは以下で触れられているように、出力バッファが On になっていることが原因です。

この関数をコールする前でも出力できるように、 スクリプトの全ての出力をサーバ内にバッファリングさせることができます。 そのためには、ob_start() や ob_end_flush() を使用するか、あるいは php.ini やサーバ設定ファイルの output_buffering を使用します。

PHP: setcookie - Manual


ですので php.ini で以下のようにして出力バッファを Off にすればいいはずです。

output_buffering = Off


が、ここで Off にしていてもあるオプションを設定すると勝手に On になってしまうようです。

output_handlerを指定するとoutput_bufferingは自動でOnになります。

http://www.y2sunlight.com/ground/?PHP5.0%2F3.php.ini%A4%CE%CA%D4%BD%B8#i1fabccc


例えば以下のようにすると

output_handler = mb_output_handler

mb_output_handler() は、 ob_start() のコールバック関数です。

http://jp.php.net/manual/ja/function.mb-output-handler.php

とあるので、実際は以下を実行するのと同じことのようで、

ob_start("mb_output_handler");

そしてこの ob_start() というやつは

この関数は出力のバッファリングをオンにします。

http://jp.php.net/manual/ja/function.ob-start.php

ということなんで出力バッファリングが勝手に On になるようです。


つまり、setcookie() を後から出力した場合にエラーを出すには以下のようにしないとだめみたいです。

output_buffering = Off
;output_handler = 


まあ全然重要な話ではないんですが、何で出ないんだろ?と気になった時のために。