php基于redis处理session的方法
一个基于redis的处理session的方法,如下。
<?php
classSession_custom{
private$redis;//redis实例
private$prefix='sess_';//session_id前缀
//会话开始时,会执行该方法,连接redis服务器
publicfunctionopen($path,$name){
$this->redis=newRedis();
return$this->redis->connect("127.0.0.1",6379);
}
//会话结束时,调用该方法,关闭redis连接
publicfunctionclose(){
$this->redis->close();
returntrue;
}
//会话保存数据时调用该方法,在脚本执行完或session_write_close方法调用之后调用
publicfunctionwrite($session_id,$data){
return$this->redis->hMSet($this->prefix.$session_id,array('expires'=>time(),'data'=>$data));
}
//在自动开始会话或者通过调用session_start()函数手动开始会话之后,PHP内部调用read回调函数来获取会话数据。
publicfunctionread($session_id){
if($this->redis->exists($this->prefix.$session_id)){
return$this->redis->hGet($this->prefix.$session_id,'data');
}
return'';
}
//清除会话中的数据,当调用session_destroy()函数,或者调用session_regenerate_id()函数并且设置destroy参数为TRUE时,会调用此回调函数。
publicfunctiondestroy($session_id){
if($this->redis->exists($this->prefix.$session_id)){
return$this->redis->del($this->prefix.$session_id)>0?true:false;
}
returntrue;
}
//垃圾回收函数,调用周期由session.gc_probability和session.gc_divisor参数控制
publicfunctiongc($maxlifetime){
$allKeys=$this->redis->keys("{$this->prefix}*");
foreach($allKeysas$key){
if($this->redis->exists($key)&&$this->redis->hGet($key,'expires')+$maxlifetime<time()){
$this->redis->del($key);
}
}
returntrue;
}
}
//调用自定义的session处理方法
$handler=newSession_custom();
session_set_save_handler(
array($handler,'open'),
array($handler,'close'),
array($handler,'read'),
array($handler,'write'),
array($handler,'destroy'),
array($handler,'gc')
);
//下面这行代码可以防止使用对象作为会话保存管理器时可能引发的非预期行为,表示当脚本执行之后或调用exit()之后,存储当前会话数据并关闭当前会话
register_shutdown_function('session_write_close');
session_start();
//可以使用session了
补充:
php.ini文件中的session.gc_probability与session.gc_divisor两个配置选项共同决定gc函数调用的时机。默认值分为为1和1000,表示每个请求只有1/1000的机会调用gc函数。
以上就是本文的全部内容,希望对大家的学习有所帮助。