Session.saveを独自設定する場合の注意

以前、Session.saveを独自設定を指定して、セッション有効期限などを変更する方法を紹介しましたが、

この方法、セッションをDBあるいはキャッシュに設定する場合は避けた方が良さそうです。

実例

セッションのDB保存設定をベースに、session.cookie_lifetimeを0=ブラウザを閉じるまで に変更しています。
実装状態はこちら

この設定で運用していたら、viewで$session->flash()した後もメッセージが消えず、

  1. ログイン後もログインエラーメッセージが出続ける
  2. データセーブ後、別の画面に遷移しても保存完了メッセージが出続ける*1

などの現象が発生していました。


調べると、$session->flushで$_SESSIONからはMessageが削除されるのに、データベースのcake_sessionsでは削除されていません。
これが原因のようです。

解析

core.phpのSession.saveに、cake/php/database/cache以外の文字列を設定すると、セッションは


cake/libs/session.php 443行目以降*2

default:
	if (empty($_SESSION)) {
		$config = CONFIGS . Configure::read('Session.save') . '.php';
			if (is_file($config)) {
			require_once ($config);
		}
	}
	break;

の内容で設定されます。


ところが、この独自設定ファイルの読み込みは、$_SESSIONが空の場合しか実行されません。


一方、databaseあるいはcache設定の場合、$_SESSIONが空以外の場合、session_set_save_handlerの設定を行います。


独自設定にした場合、session_set_save_handlerの設定が行なわれなくなるので、セッションの読み込み、書込みに失敗する場合があるようです。


発端となった$session->flush()でメッセージが消えない現象も、その一例のようです。
Session.saveをdatabaseに変更したら、発生しなくなりました・・・・


セッションは、普通ファイルに設定するだろうからあまり見られない現象のようで、探求に苦労しました。。

*1:完了メッセージをセッションで出力状態

*2:ver1.2.5