PHPでHTTPヘッダを送信する関数に「header」がありますよね。
僕は今まで、この関数はリダイレクト処理くらいにしか使ったことがなかったもんで、こいつはリダイレクト処理を行ってくれる、CakePHPでいうところの$this->redirect()と同じ関数だと思ってました。
いや、まあ実際に$this->redirect()も中身を見てみると最後にheaderをやってるんですが、これってheaderが読み込まれた時点でページ遷移が発生するわけじゃなかったんですね。
知らなかったこと
header('Location: test.php'); $a = $b = 1; $a + $b;
みたいなことを書いておくと、$a + $bまでの処理を行ってから、test.phpに飛ぶみたいですね。
なので、headerでリダイレクト処理を行うときは、exitをつけるのを忘れないようにしないといけないみたいです。
header('Location: test.php'); exit;
今までたまたま上手く行っていたから気にしたことなかったんですけど、この前headerが上手く動かない変なバグに出会いまして……いろいろと原因を探ってみたら、このexitが足りないのが問題だったようです。これを加えたら、正常に動いた。
CakePHPの$this->redirect()も、見るとちゃんとexitしてました。
まとめ
うちの先輩プログラマにも「そんなの常識だよ?誰もがやってる当り前の処理だよ。お前はマジでプログラマの風上にも風下にも風前にも風後にも風左にも風右にも片隅にもおけないな」って言われました。
俺だけがやっていなかったようです。今後は気をつけたいと思います。
LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。