smartyを使用した環境でセッション処理を行おうとしたのですが、プログラム「session_start()」のところでエラーとなってしまいました。以下、問題が発生した環境です。
- PHP : 5.3.0
- smarty : 2.5.26
- 文字コード : UTF-8
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at xxxxxxxxxindex.html:1) in xxxxxxxxxindex.php on line 61
テンプレートを読み込み、ページを表示するところは動作しているのですが、どうしても上のエラーがくっついてきます。
いくつか調べているうちに、生成されたhtmlページの1行目の先頭に半角スペースが入っていることが原因だと分かりました。わかりづらいかもしれませんが、以下のように半角スペースがひとつ混入しています。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
テンプレートでもプログラムでも入力したはずのない半角スペースが出力されてしまう。この原因はどうやら、BOM(Byte Order Mark)というUTF-16などのエンコード方式でファイルの先頭に記入される値のようです。この値はsmartyテンプレートファイルや、PHPプログラムファイルの時点では目には見えないので、おそらく選択して消すことができません。
解決方法としては、BOMが混入している疑いのあるファイルを、秀丸などのテキストエディタを使用して一度shift-jisなどにエンコードして、再度UTF-8にエンコードします。もちろん見た目には変化はありませんが、これでBOMが消えるはずです。
見えない敵なだけに、原因を探るのに時間がかかりました。ところでどこで混入したんだろう。。。
コメントする