使用Redis保存用户会话Session的案例分析

54次阅读
没有评论

共计 2789 个字符,预计需要花费 7 分钟才能阅读完成。

自动写代码机器人,免费开通

这篇文章将为大家详细讲解有关使用 Redis 保存用户会话 Session 的案例分析,丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

前言

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();
 }
}

SessionManager 构造函数主要用来连接 Redis 服务器,使用 session_set_save_handler 函数设置 session 回调函数,并调用 session_start 函数开启 session 功能。因为本例中 open、close 和 gc 回调函数的作用不是很大,所以直接返回 true。

在 write 回调函数中,以 session ID 作为 key, 把 session 的数据作为 value 存储到 redis 服务器,设置 session 的过期时间为 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 保存用户会话 Session 的案例分析

最后,我们到 redis 里查看结果:

使用 Redis 保存用户会话 Session 的案例分析

关于“使用 Redis 保存用户会话 Session 的案例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计2789字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)