session_start()も「すべての実際の出力の前にコールする必要」がある!



Warning: Cannot modify header information - headers already sent by (output started at ***.php:***) in ***.php on line ***


PHPが吐く上記エラー。
その原因は何でしょうか。
いや、わかってしまえば当たり前なのですが、また忘れそうなので、久しぶりの技術メモです。

まず最初に思い出すのはPHPのマニュアルの以下の文章。



header() 関数は、 通常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の出力の前にコールする必要があることです。 頻出するエラーとして、include() または require() 関数、他のファイルをアクセスする関数に 空白または空行があり、header() の前に出力が 行われてしまうというものがあります。

大抵header()絡みだろ?と思いますよね。


しかし確認しても、header()は使っていない場合にどうするか。
行番号のあたりを確認すると、session_start()を使っていないでしょうか?





この関数は、設定によって複数の HTTP ヘッダを送信します。



クッキーに基づくセッションを使用している場合、ブラウザに何か出力を行う前に session_start() をコールする必要があります。


つまり、header()関数同様、すべての実際の出力の前にコールする必要があるわけです。
cookieの送出方法を考えて見れば当たり前ですね。


output_bufferingをphp.iniで指定して回避する方法もありますが、そもそもそういう内容を書かないように気を付けなくちゃいけません。
反省、反省でした。