sessionのタイムアウトについて。

sessionの有効時間を長めにとりたくて
一生懸命
 config/core.php
の『CAKE_SESSION_TIMEOUT』の設定を変更してた。


設定はこんなかんじ↓


 define('CAKE_SECURITY', 'high');
 define('CAKE_SESSION_TIMEOUT', '1080');


こうすると、実際のセッション有効時間は
1080*10(highの場合は10なので。)=10800秒=3時間



だけどセッションが3時間持ったためしがない。。
ずっと解らなくて、php.iniの設定見て
あれれ?と思ってcakeのファイルでgrepかけたところ
ようやく原因が判明!!



↑で設定しているセッション時間は


 「設定した時間が過ぎたら、新しいセッション吐き出しなおすよ♪」 
という設定。
でも、セッションにはもう1つ


 「設定した時間が過ぎたら、一定確率でサーバ側のセッション削除するよ♪」


という設定がある。
私は↑の設定が、後者の設定だとずっと思い込んでた。。



つまり、


 「もしsessionが3時間以上経ってからアクセスしたら
 新しいsession吐き出すぞー♪」
 「え?3時間も経つ前に、一定確率でsession削除しちゃうよ?」

という状況に陥ってた。。。



後者の削除時間設定はphp.iniの『session.gc_maxlifetime』で設定する。
一定確率、というのも、php.ini内の
session.gc_probability』/『session.gc_divisor』ってなってる。


php.iniの設定がデフォルトなら
こんなかんじ↓


 session.gc_probability = 1
 session.gc_divisor = 100
 session.gc_maxlifetime = 1440


これだと、


 「1440秒(24分)より前に更新されているsessionは
 他のsessionが更新された時に、1/100の確立で削除するよ♪」


というカタチ。
直接php.iniの設定を変更すると、全プログラムに関わっちゃうので
configの設定ファイル内で


 ini_set('session.gc_maxlifetime', 10800);


を追記。
検証の時は、1/100の確立を待ってるのが面倒だから


 ini_set('session.gc_divisor', 1);


も追記して、
3時間過ぎたら他session更新時100%の確立で削除。



これで、


 「もしsessionが3時間以上経ってからアクセスしたら
 新しいsession吐き出すぞー♪」
 「3時間経ってたら、アクセス前に一定確率でsession削除するかもね☆彡」


という感じに変わった〜♪



いろいろググってた時
sessionが何故か残ってる!!という人は多かったけど
sessionが消えちゃう!!っていう人全然いなかったんだよね。。
原因不明のまま諦めようかと思ってたけど
自分で気がつけて良かったぁ(*>ω<)o


♪ ♪ ♪ 追記@09/01/23 ♪ ♪ ♪ 


session.gc_maxlifetime の設定だけでは不十分でした(>▽<;
さらに、session_save_pathの指定も消えない為の設定です。


 session_save_path("/tmp/hoge");