<?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);
?>
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);
?>
你需要在 open 方法或 read 方法中自行完成回收
'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,但是数据库的数据没有删除