header Locationを使って画面遷移した時にセッションが消える

header Locationを使って画面遷移をした時にセッションが消える問題があり、盛大にはまったので対処方法の覚え書き。

起こっていた現象

ページ遷移後にあるセッション変数による条件分岐にうまく入れていないことがわかった。
該当するセッション変数の値を見ると空になっている。
ページ遷移直前に値を代入しても消える。
つまり、ページ遷移したと同時にセッションが消えている状態。
 

まず行った対策

遷移先のURLにセッションIDを埋め込んだ。具体的には下記の通り。

header("Location: ./" . $file . "?" . session_name() . "=" . session_id());

これでもうまくいかず。
 

解決した方法

セッションデータへ値の書き込みが終わったら、session_write_close()を実行する。セッション開始からの大まかな流れは下記の通り。

session_start();
$_SESSION["test_flag"] = '1';
session_write_close();
header("Location: ./" . $file . "?" . session_name() . "=" . session_id());
exit;

 

とにかく、ページ遷移時やAjaxでの非同期処理を行う際は、セッション変数への代入が終わった時、もしくはページ遷移直前にsession_write_close()を実行するのが無難かと。
 

参考

  • php.net | セッション処理 > 例 > 基本的な使用法
  • php.net | session_write_close