[PHP-users 9034] session_set_save_handlerのgc について

go php-users@php.gr.jp
Wed, 31 Jul 2002 13:01:28 +0900


いつもお世話になります。井上ともうします。

以前同じ質問をさせていただいてCRONを使うということをご指導いただいたのですが、
どうしても解決できなかいのでもう一度質問させてください。

セッションデータをMySQLで使用してユーザー管理したいと思っています。
session_set_save_handlerを使用してopen,close,read,write,destroyは問題なく動
いているのですが、gcだけなんの反応もありません。ログアウトしないときでも一定
時間が過ぎるとセッションのデータを全て削除したいと思っています。
Cronを使用するとのことでしたが、どのように指定すれば良いのでしょうか?
session_save_handler()を記述してあるファイルを指定するのでしょうか?

session_save_handler()を使用してGCを使ったことのある方、識者の方
ご指導よろしくお願いいたします。

以下の内容です。

環境
solaris8 2/02
Apache 1.3.26
php 4.2.1
MySQL 3.23.45

●セッションテーブルの内容
CREATE TABLE session (
   sid varchar(32) NOT NULL default '',
   uid varchar(16) NOT NULL default '',
   password varchar(16) default NULL,
   rawdata varchar(255) default NULL,
   rdate timestamp(14) NOT NULL,
   PRIMARY KEY  (sid)
) ;

●php.iniの設定
session.save_handler = user (filesでもgc以外動作しました。)
session.gc_probability = 100 (%で表すため100にする)
session.gc_maxlifetime = 10 (テストで10秒にしています。)
session.save_path = /tmp(MySQLを使用しているのでファイル作成されません。)

●session_set_save_handlerの中のgcの内容
if(!isset($SessDBConn)){
   $SessDBConn=0;

   function RM_sess_open($garbage, $sid){
     global $sess_value, $SessDBConn;
include  "passwd.php";
   }

   function RM_sess_close(){
     global $sess_value, $SessDBConn;
     return true;
   }
       途中省略
        ・
        ・
        ・
//ここからが問題のgcの部分です。
     function RM_sess_gc($max){
     global $sess_value, $SessDBConn;
     if(!$SessDBConn) return false;
//実際に削除できるかセッション外で実験したら削除できました。
     $out = $max ;
     $sql  = "delete from session where rdate < (NOW() - $out )";
     mysql_query($sql , $SessDBConn);
   }

   session_set_save_handler(
          "RM_sess_open",
          "RM_sess_close",
          "RM_sess_read",
          "RM_sess_write",
          "RM_sess_destroy",
          "RM_sess_gc");
}