共计 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 里查看结果:
关于“使用 Redis 保存用户会话 Session 的案例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
向 AI 问一下细节