Redis专题(十) ——Redis存储session
(原创内容,转载请注明来源,谢谢)
一、概述
PHP默认是将session存于服务器的文件中。当并发量大,此方式效率低,因此可以采用redis存储session。
要改变session的存储位置,首先要改变php.ini中的配置项session.save_handler,将其值设置为user。
二、改变存储位置函数
php内置的函数session_set_save_handler可以重新设定session的保存方式,包括session的打开、关闭、写入、读取等。
session_set_save_handler方法实质上不仅实现存储位置由文件变为redis(或其他用户定义的存储类型如memcache),还需要自定义session被打开、关闭、设置、读取、销毁、回收等情况下,php具体去执行的内容。因此,该方法传入的变量全是回掉函数。
该方法的具体内容,在php官方文档中,定义如下:
boolsession_set_save_handler ( callable $open , callable $close , callable $read ,callable $write , callable $destroy , callable $gc [, callable $create_sid [,callable $validate_sid [, callable $update_timestamp ]]] )
具体定义如下:
1、open
当session被打开时,会自动调用此函数。类似于类的构造函数。
2、close
当session关闭时调用的函数,类似于析构函数。
3、read
如果会话中有数据,read 回调函数必须返回将会话数据编码(序列化)后的字符串。 如果会话中没有数据,read回调函数返回空字符串。
其中,存储在session的内容如果是数组、对象,必须序列化后存储,而session调用此函数后会自动将值进行反序列化。
4、write
当要保存session数据时,当前会话 ID 以及 $_SESSION 中数据序列化之后的字符串作为参数。序列化后的数据将和会话 ID 关联在一起进行保存。当调用 read 回调函数获取数据时,所返回的数据必须要和传入 write 回调函数的数据完全保持一致。
5、destroy
调用session_destroy时会调用此函数。
6、gc
会话回收清理旧数据时调用的内容。
7、create_id
当需要重新生成新的会话id时调用的函数。
三、PHP实现session存储于redis
<?php
//类的功能——实现将session存储在redis
class SessionSaveRedis{
private $redis;
private $sessionPath;
private $sessionName;
private$sessionExpireTime = 100;
//构造函数,连接redis
public function__construct(){
$this->redis= new Redis();
$this->redis->connect('127.0.0.1',6379);
$this->loadSession();
session_start();
}
//加载自定义session方法
public functionloadSession(){
session_set_save_handler(
array($this,'open'),
array($this,'close'),
array($this,'read'),
array($this,'write'),
array($this,'destroy'),
array($this,'gc')
);
}
public functionopen($path, $name){
return true;
}
public functionclose(){
return true;
}
//存入redis时,key采用session:id,
//便于统一管理所有的session,与redis中存储的其他内容作为区分
public functionread($id){
$value =$this->redis->get('session:' . $id);
if($value){
return$value;
}else{
return'';
}
}
public functionwrite($id, $data){
if($this->redis->set('session:'. $id, $data)){
$this->redis->expire('session:'. $id, $this->sessionExpireTime);
returntrue;
}
returnfalse;
}
public functiongc($time){
return true;
}
public function__destruct(){
session_write_close();
}
}
——written by linhxx 2017.08.14