session_startでheader already sentの警告 原因はBOM

投稿者: | 2017年8月1日

PHP使いなら誰でもsession_start時に下記のエラーが表示された経験があるかと思います。

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent

私も今回このエラーに遭遇しました。
大抵の場合、session_startの前に何らかの出力処理が入っていたりするのが原因なので、どこかなと探そうとしたらエラーが発生しているファイルに完全にそんなものが入る隙もありませんでした。

<?php
session_start();

何なんだとこれは・・・と検索していたところ、BOMというものが入っていたのが原因だそうです。

BOMとは「バイトオーダーマーク」と呼ばれるもので、UTF-8ファイルの先頭に付加し、UTF-8の符号化の種類の判別に用いられるそうです。

通常はBOMはつけなくてもよく、私もこれまで意識していませんでした。
しかし、秀丸の保存画面を開いたところなぜかこのファイルだけBOMにチェックが入っていたのですよね。

BOM

BOMをつけずに保存したところ、警告は表示されなくなりました。

何でこんなことしたのか疑問なのですが、今回のプロジェクトは他社が作成したものの修正でしたので、もしかすると他社が作成した時点でついていたのかもです。