余計な改行は命取り | suzukiのCakePHPブログ

余計な改行は命取り

これホント、どういうわけかわからないんですが、
ものすごくハマったのでメモ。

まずは現象…

特定のコントローラのときだけセッションが消える(セッションが読み込めない)状況になる。
例えば/contents/indexや/items/viewでは$_SESSIONが存在するのに、
/trouble/indexでは$_SESSIONが存在しないという現象。
もちろん実際にはSessionファイルは残っているしcookieもちゃんとある。
だからまた別のコントローラに変遷すると$_SESSIONが存在するというなんとも奇妙な現象。

で、原因特定までの経緯

散々色々試してみた挙句の果てに、
ちゃんとsession_start()やってんのか?コラ?
という疑問がわいてきたので、AppControllerの
beforeFilterにsession_start();を追加してみる。

すると…
問題のコントローラの32行目がなんだかおかしいぞというエラー表示が…(本当は英語だけど)
で、やっぱコントローラが悪いのかよ!と思ってその行を見てみると、なんと

?>でphpコードが終了した次の行。
その行は何も書かれていない空行。
なぜその空行がエラー…?

と、疑問に思いつつもその空行を削除してみたら

あら不思議。
なんの問題も無くセッションが読み込めました。

結論…
よくわからんけどcakeのphpファイルには余計な空行(というか改行)を入れんな!
ということで。

これってcakeだけじゃなくてphp共通のセオリーなんでしょうか?
もしかして私が無知なだけ?
もしわかる方がいらっしゃいましたら教えてプリーズ。

その後調べてみた結果以下のようなことが

ZendFrameworkのコーディング規約
PHP コードのみからなるファイルでは、終了タグ ("?>") は決して含めてはいけません (項B.2.1. 「全般」 を参照ください)。

との記述が。まあZendFrameworkの話ですが。
で、どうも<?PHP  ?>直後の改行が認識されないとか、なんとかそういうこともあるようで、
単純に作法として閉じタグ"?>"の後ろには改行を入れない、もしくは
閉じタグ自体を記述しないと覚えておいた方がいいみたい。