[PHP-users 35559] Re: session_cache_expire 戻り値

Tomoo Nomura nomurat @ tmo.co.jp
2011年 5月 4日 (水) 21:43:24 JST


こんにちは。

だいぶ前の話になりますが、sessionの有効期限について、かなり解明できまし
たので、備忘録として投稿しておきます。

まず、Garbage Collectionに関して、

ini_set( "session.gc_maxlifetime", 10 ) ;
session_start() ;

上記のようにした場合、12分後に再度アクセスした場合、session fileは存在し
ており、$_SESSION['...']の値も生きておりました。
ここで、動きがわからなくなり悩んでいたのですが、どうもsession fileを破棄
するのは、session_start()の最後の部分のようです。つまり、2回目のアクセ
スでは、最初存在しているsession fileより通常どおりに値を読み込
み、$_SESSION['...']を復帰します。そして、その後session fileを破棄しま
す。事実、2回目のsession_start()後にsession.save_pathを見にいくと、
session fileがなくなっています。従いまして3回目のアクセスをすると、
sessionは引き継がれません。

3回目のアクセスを制限できれば良いということならばこれでも良いのですが、
厳密に2回目のアクセスを制限するためには、Garbage Collection の機構を使
うのは好ましくないように思います。

従いまして、ここは以前ご指摘頂いたように時刻を自分で管理して破棄するよう
にするしかないと判断致しました。

   session_cache_limiter( 'PRIVATE_NO_EXPIRE' ) ;
   session_start() ;
   $sttime   = $_SESSION['sttime'] ;
   $cutime   = time() ;
   $_SESSION['sttime'] = strtotime( "+$SESSION_EXPIRE minutes" ) ;
   if ( $cutime > $sttime ) logout() ;

これで、思う結果が得られました。

野村

> こんにちは。
> ご紹介いただいたSITEは私も見ていたのですが、もう一度詳しく読み直してみま
> した。私の場合は、
> session.gc_probability = 1
> session.gc_divisor     = 1
> としていますのでGCは毎回走るのですが、先のメールに書きましたとおり、自分
> 自身のsession_idがcookieに残っているので、たとえGCの対象となる日時スタン
> プでも削除されないようです。
> ということで、どうもsession_start()時にGCを走らせて自分自身を削除するの
> は無理なように感じました。
> 
> そこで、以前に2番目の方法として書いた方法を試してみました。
> session_set_cookie_params( 600 ) ;
> session_start() ;
> としてやり、10分でsession_idを忘れるようにしてやれば、新しいsession_idを
> 作るのでうまく行くはずです。
> と思ってやったのですが、これでもsession_idを忘れてくれませんでした。
> もう少し、調べてみます。
> 
> 野村

-- 
****** Nomura Technical Management Office Ltd. *****************
 Tomoo Nomura      nomura @ tmo.co.jp       http://www.tmo.co.jp/
    Phone: +81-78-797-0240 Fax: +81-50-3743-1336
 Worldwide Airline Timetable 'Flight Planner'
 European Electronic Timetable 'HAFAS'         ValueFax Support
****************************************************************


PHP-users メーリングリストの案内