2011年7月19日火曜日

phpでWarning: Cannot modify header information - headers already sent by ~が出たときの対処法

タイトルの通りなんだけど、phpでheader関数やsession_startを使うとき、最初の頃は
良く目にするエラー。
エラーの内容は読んで字の如くヘッダを編集しようとしたけど既にヘッダが送信されてるよってこと。
対処法その1
header関数やsession_startの前に改行やタブやスペースやHTMLなどをつけていないか。
特に?>の後に改行を入れている場合ハマる。例えば、
<?php
require_once("hogehoge.php");
?>
<?php
session_start();
?>
はエラーになる。太字の?>で改行を出力しているから。

対処法その2
上記対応でもNGの場合、php.iniの設定を修正すれば直る(らしい
php.iniでoutput_buffering = ON 又は output_buffering = 4096のようにすると良いらしい。
参考

対処法その3
上記2つでもNGの場合、もし文字コードがUTF-8なら、BOM付きでないか確認する。
これ、自分がハマりました。
windows上のapache+phpでは問題なく動くが、いざLinuxにもっていくと動かないという症状に悩まされます。
検証法は割と簡単で、Linuxマシン上で、エラーが出ているファイルをコピーし、コピーしたファイルの中身を全て削除後、以下のコードを打ち込みます。
<?php
echo headers_sent();
保存したら、php hogehoge.php(上記編集したファイル)で実行。1が表示されればまずBOMありです。

対処法は関係するファイルの文字コードをUTF-8のBOMなしに変換する事。
これで直りました。やれやれ。

エラーの表示もう少し分かりやすくならないものかねぇ。単に出力されているぞ!ではなく”何が”出力されているのかぐらい出してくれればまだ追いかけられる物を>ブツブツ

0 件のコメント:

コメントを投稿