<?php
include_once 'comm/opmysql.php';
class MySessionHandler implements SessionHandlerInterface {
    /**
    * @access private
    * @var object 数据库连接
    */
    private $_dbLink;
    /**
    * @access private
    * @var string 保存session的表名
    */
    Private $_sessionTable;
    /**
    * @access private
    * @var string session名
    */
    private $_sessionName;
    /**
    * @const 过期时间
    */
   const SESSION_EXPIRE = 180;
    public function __construct($dbLink, $sessionTable) {
        if(!is_object($dbLink)) {
            return false;
        }
        $this->_dbLink = $dbLink;
        $this->_sessionTable = $sessionTable;
  }
    /**
    * 打开
    * @access public
    * @param string $session_save_path 保存session的路径
    * @param string $session_name session名
    * @return integer
    */
    public function open($session_save_path, $session_name) {
        $this->_sessionName = $session_name;
        return 0;
    }
    /**
    * 关闭
    * @access public
    * @return integer
    */
    public function close() {
        return 0;
    }
    /**
    * 关闭session
    * @access public
    * @param string $session_id session ID
    * @return string
    */
    public function read($session_id) {
        $query = "SELECT value FROM {$this->_sessionTable} WHERE sid = '{$session_id}' AND UNIX_TIMESTAMP(expiration) + " . self::SESSION_EXPIRE . " > UNIX_TIMESTAMP(NOW())";
        $result = $this->_dbLink->getRowsNum($query);
        if(!isset($value) || empty($value)) {
            $value = "";
            return $value;
        }
        $this->_dbLink->uidRst("UPDATE {$this->_sessionTable} SET expiration = CURRENT_TIMESTAMP() WHERE sid = '{$session_id}'");
        $value = $result->fetch_array();
        $result->free();
        return $value['value'];
    }
 
    /**
    * 写入session
    * @access public
    * @param string $session_id session ID
    * @param string $session_data session data
    * @return integer
    */
    public function write($session_id, $session_data) {
        $query = "SELECT value FROM {$this->_sessionTable} WHERE sid = '{$session_id}' AND UNIX_TIMESTAMP(expiration) + ".self::SESSION_EXPIRE." > UNIX_TIMESTAMP(NOW())";
        $result = $this->_dbLink->getRowsRst($query);
        var_dump($result);
        if(!empty($result)) {
            $result = $this->_dbLink->uidRst("UPDATE {$this->_sessionTable} SET value = '{$session_data}' WHERE sid = '{$session_id}'");
            var_dump($result);
        }
        else{
            $result = $this->_dbLink->uidRst("INSERT INTO {$this->_sessionTable} (sid, value) VALUES ('{$session_id}', '{$session_data}')");
        }
        if($result){
            return 0;
        }
        else{
            return 1;
        }      
    }
    /**
    * 销魂session
    * @access public
    * @param string $session_id session ID
    * @return integer
    */
    public function destroy($session_id) {
        $result = $this->_dbLink->uidRst("DELETE FROM {$this->_sessionTable} WHERE  UNIX_TIMESTAMP(expiration) + ".self::SESSION_EXPIRE." < UNIX_TIMESTAMP(NOW())");
        if($result){
            return 0;
        }
        else{
            return 1;
        }
    }
    /**
    * 垃圾回收
    * @access public
    * @param string $maxlifetime session 最长生存时间
    * @return integer
    */
    public function gc($maxlifetime) {
     echo $maxlifetime;
        $result = $this->_dbLink->uidRst("DELETE FROM {$this->_sessionTable} WHERE  UNIX_TIMESTAMP(expiration) + ".self::SESSION_EXPIRE." < UNIX_TIMESTAMP(NOW())");
        if($result){
            return 0;
        }
        else{
            return 1;
        }
    }
}$dblink=new db($$host="localhost",$name="root",$pwd="");
$sessionTable="sessioninfo";
$handler=new MySessionHandler($dblink,$sessionTable);
session_set_save_handler($handler);
session_start();
$_SESSION['name']=3;
$_SESSION['AAA']=2;
$_SESSION['pwd']=4;
$_SESSION['DDD']=1;
echo $_SESSION['pwd'];
print_r($_SESSION);
?>

解决方案 »

  1.   

    windows 系统吧?
    你需要在 open 方法或 read 方法中自行完成回收
      

  2.   

    我直接在read函数后面显示调用gc函数 $this->gc();,发现没用 
      

  3.   

    array (size=3)
      'name' => int 3
      'AAA' => int 2
      'pwd' => int 4
    array (size=2)
      0 => string 'name|i:3;AAA|i:2;pwd|i:4;' (length=25)
      'value' => string 'name|i:3;AAA|i:2;pwd|i:4;' (length=25)
    int 0
    很奇怪,,我在open read函数内部调用gc函数$this->gc($maxlifetime),等时间到了的确是查询不到了时间到期之后的数据了,
    array (size=3)
      'name' => int 3
      'AAA' => int 2
      'pwd' => int 4
    boolean false,但是数据库的数据没有删除