延续上一篇
[[(https://blog.csdn.net/sclbk/article/details/107546676)]]
class MyRedisSession implements SessionHandlerInterface{
private $redis_obj;
#开启session时的执行方法
public function open($save_path, $session_id)
{
// TODO: Implement open() method.
var_dump(__METHOD__);
$this->redis_obj=new Redis();
$this->redis_obj->open('127.0.0.1','6379');
return true;
}
#关闭session的执行方法
public function close()
{
var_dump(__METHOD__);
// TODO: Implement close() method.
return $this->redis_obj->close();
return true;
}
#当读取session时执行的方法 必须返回序列化的内容
public function read($session_id)
{
var_dump(__METHOD__);
// TODO: Implement read() method.
$redis_key='redis_session:'.$session_id;
$redis_data=$this->redis_obj->get($redis_key);
// var_dump($redis_data);
if(empty($redis_data)){
return serialize([]);
}else{
#每次访问是更新过期时间
$this->redis_obj->expire($redis_key,1400);
return $redis_data;
}
}
#销毁当前会话session
public function destroy($session_id)
{
var_dump(__METHOD__);
// TODO: Implement destroy() method.
$redis_key='redis_session:'.$session_id;
if($this->redis_obj->del($redis_key)){
return true;
}else{
return false;
}
}
#1000/1的比例删除当前会话过期的session
public function gc($maxlifetime)
{
var_dump(__METHOD__);
// TODO: Implement gc() method.
}
#写入session是执行方法
public function write($session_id, $session_data)
{
var_dump(__METHOD__);
// TODO: Implement write() method.
if($this->redis_obj->set('redis_session:'.$session_id,$session_data)){
$this->redis_obj->expire('redis_session:'.$session_id,1440);
return true;
}else{
return false;
}
}
}
$obj=new MyRedisSession();
session_set_save_handler(
[$obj,'open'],
[$obj,'close'],
[$obj,'read'],
[$obj,'write'],
[$obj,'destroy'],
[$obj,'gc']
);
#开启session
session_start();
//$_SESSION['admin_info']=['admin_id'=>1,'admin_name'=>'list'];
echo "<hr>";
//session_destroy();
var_dump($_SESSION);
实现原理同第一篇相仿