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 =
まあ全然重要な話ではないんですが、何で出ないんだろ?と気になった時のために。