如何使⽤Redis保存⽤户会话Session详解
前⾔
PHP内置的绘画存储机制是把全部的会话数据保存在服务器上的⽂本⽂件⾥⾯,这些⽂件通常都是保存在服务器上的临时⽬录⾥。如果并发量⼤,读写效率⾮常低。⽽Redis对⾼并发的⽀持⾮常好,所以,可以使⽤redis替代⽂件存储session。session_set_save_handler函数
PHP的session_set_save_handler函数⽤来定义⽤户级session保存函数(如打开、关闭、写⼊等)。原型如下:bool session_set_save_hanler(callback open,callback close,callback read,callback write,callback
destory,callback gc)
参数描述
open当session打开时调⽤此函数。接收两个参数,第⼀个参数是保持session的路径,第⼆个参数是session的名字。此回调函数操作成功返回 TRUE,反之返回 FALSE。
close当session操作完成时调⽤此函数。不接收参数。此回调函数操作成功返回 TRUE,反之返回 FALSE。
read以session ID作为参数。通过session ID从数据存储⽅中取得数据,并返回此数据。如果数据为空,可以返回⼀个空字符串。此函数在调⽤session_start 前被触发
write当数据存储时调⽤。有两个参数,⼀个是session ID,另外⼀个是session的数据
destroy当调⽤session_destroy 函数时触发destroy函数。只有⼀个参数 session ID,此回调函数操作成功返回 TRUE,反之返回 FALSE。
gc当php执⾏session垃圾回收机制时触发,此回调函数操作成功返回 TRUE,反之返回 FALSE。
Session管理类
到PHP的配置⽂件php.ini,修改为下⾯内容,保存并重启php-fpm服务。
session.save_handler = redis
我们编写⼀个⽤来管理session的类:
<?php
class SessionManager{
private $redis;
private $sessionSavePath;
private $sessionName;
private $sessionExpireTime = 60;//redis,session的过期时间为30s
public function __construct(){
$this->redis = new Redis();//创建phpredis实例
$this->redis->connect('127.0.0.1', 6379);//连接redis
//$this->redis->auth("123456x");//授权
$retval = session_set_save_handler(
array($this,"open"),
array($this,"close"),
array($this,"read"),
array($this,"write"),
array($this,"destroy"),
array($this,"gc")
);
session_start();
}
public function open($path,$name){
return true;
}
public function close(){
return true;
}
public function read($id){
$value = $this->redis->get($id);//获取redis中的指定记录
if($value){
return $value;
}else{
return '';
}
}
public function write($id,$data){
if($this->redis->set($id,$data)){//以session ID为键,存储
$this->redis->expire($id,$this->sessionExpireTime);//设置redis中数据的过期时间,即session的过期时间
return true;
}
return false;
}
public function destroy($id){
if($this->redis->delete($id)){//删除redis中的指定记录
return true;
}
return false;
}
public function gc($maxlifetime){
return true;
}
public function __destruct(){
session_write_close();
}
}
session如何设置和读取SessionManager构造函数主要⽤来连接Redis服务器,使⽤session_set_save_handler函数设置session回调函数,并调⽤session_start函数开启session功能。因为本例中open、close和gc回调函数的作⽤不是很⼤,所以直接返回true。
在write回调函数中,以session ID 作为key,把session的数据作为value存储到redis服务器,设置sess
ion的过期时间为30秒。在read 回调函中,以session ID 作为key从redis服务器中读取数据,并返回此数据。⽽在destroy回调函数重,则以session ID 作为key 从redis服务器中删除对应的session数据。
使⽤Session
先建⽴⼀个set.php⽂件,⽤来设置Session:
<?php
require_once 'SessionManager.php';
new SessionManager();
$_SESSION['username'] = 'helloweba';
然后建⽴get.php⽂件,⽤来获取Session:
<?php
require_once 'SessionManager.php';
new SessionManager();
echo $_SESSION['username'];
很显然,我们先包含session管理类,然后实例化后就可以使⽤PHP正常的session函数了。
测试时,⾸先访问set.php,然后再访问get.php,输出结果如下所⽰:
最后,我们到redis⾥查看结果:
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论