PHP使用Redis替代文件存储Session的方法


Posted in PHP onFebruary 15, 2017

本文实例讲述了PHP使用Redis替代文件存储Session的方法。分享给大家供大家参考,具体如下:

PHP默认使用文件存储session,如果并发量大,效率非常低。而Redis对高并发的支持非常好,所以,可以使用redis替代文件存储session

这里,介绍下php的session_set_save_handler 函数的作用和使用方法。该函数定义用户级session保存函数(如打开、关闭、写入等)。

原型如下:

bool session_set_save_hanler(callback open,callback close,callback read,callback write,callback destory,callback gc)

session_set_save_handler 函数各参数作用如下表

参 数 描述
open 当session打开时调用此函数。接收两个参数,第一个参数是保持session的路径,第二个参数是session的名字
close 当session操作完成时调用此函数。不接收参数。
read 以session ID作为参数。通过session ID从数据存储方中取得数据,并返回此数据。如果数据为空,可以返回一个空字符串。此函数在调用session_start 前被触发
write 当数据存储时调用。有两个参数,一个是session ID,另外一个是session的数据
destroy 当调用session_destroy 函数时触发destroy函数。只有一个参数 session ID
gc 当php执行session垃圾回收机制时触发

在使用该函数前,先把php.ini配置文件的session.save_handler选项设置为user,否则session_set_save_handle 不会生效。

编写一个session管理类sessionManager.php ,代码如下:

<?php
class SessionManager{
 private $redis;
 private $sessionSavePath;
 private $sessionName;
 private $sessionExpireTime=30;//redis,session的过期时间为30s
 public function __construct(){
 $this->redis = new Redis();//创建phpredis实例
 $this->redis->connect('127.0.0.1',6379);//连接redis
 $this->redis->auth("107lab");//授权
 $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数据。

使用时,只需包含SessionManager类,然后实例化一个SessionManager对象。下面建立个session_set.php文件。输入代码

<?php
 include('SessionManager.php');
 new SessionManager();
 $_SESSION['username'] = 'captain';

然后再创建一个session_get.php文件,输入如下代码:

<?php
 include('SessionManager.php');
 new SessionManager();
 echo $_SESSION['username'];

测试时,首先访问session_set.php,然后再访问 session_get.php,输出结果如下所示:

PHP使用Redis替代文件存储Session的方法

再查看redis数据库,如下所示

127.0.0.1:6379> keys *
1) "oe94eic337slnjv1bvlreoa574"
127.0.0.1:6379> get oe94eic337slnjv1bvlreoa574
"username|s:7:\"captain\";"

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
用libTemplate实现静态网页的生成
Oct 09 PHP
php 保留小数点
Apr 21 PHP
Discuz!下Memcache缓存实现方法
May 28 PHP
解析posix与perl标准的正则表达式区别
Jun 17 PHP
Laravel 4 初级教程之安装及入门
Oct 30 PHP
PHP的拦截器实例分析
Nov 03 PHP
php获取远程文件的内容和大小
Nov 03 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
May 26 PHP
php实现基于pdo的事务处理方法示例
Jul 21 PHP
PHP钩子实现方法解析
May 21 PHP
php操作redis数据库常见方法实例总结
Feb 20 PHP
微信小程序结合ThinkPHP5授权登陆后获取手机号
Nov 23 PHP
Yii2中多表关联查询hasOne hasMany的方法
Feb 15 #PHP
php+Memcached实现简单留言板功能示例
Feb 15 #PHP
thinkphp3.2中实现phpexcel导出带生成图片示例
Feb 14 #PHP
PHP中Trait及其应用详解
Feb 14 #PHP
php数组指针操作详解
Feb 14 #PHP
PHP中include()与require()的区别说明
Feb 14 #PHP
php中的抽象方法和抽象类
Feb 14 #PHP
You might like
php 购物车的例子
2009/05/04 PHP
file_get_contents获取不到网页内容的解决方法
2013/03/07 PHP
PHP中isset与array_key_exists的区别实例分析
2015/06/02 PHP
jQuery 对Select的操作备忘记录
2011/07/04 Javascript
jQueryUI写一个调整分类的拖放效果实现代码
2012/05/10 Javascript
我用的一些Node.js开发工具、开发包、框架等总结
2014/09/25 Javascript
jQuery 动态云标签插件
2014/11/11 Javascript
jQuery+html5+css3实现圆角无刷新表单带输入验证功能代码
2015/08/21 Javascript
基于JavaScript如何实现ajax调用后台定义的方法
2015/12/29 Javascript
分享javascript计算时间差的示例代码
2020/03/19 Javascript
基于JavaScript实现窗口拖动效果
2017/01/18 Javascript
Node.JS使用Sequelize操作MySQL的示例代码
2017/10/09 Javascript
值得收藏的vuejs安装教程
2017/11/21 Javascript
vue项目中api接口管理总结
2018/04/20 Javascript
基于vue,vue-router, vuex及addRoutes进行权限控制问题
2018/05/02 Javascript
Express之托管静态文件的方法
2018/06/01 Javascript
微信小程序模拟cookie的实现
2018/06/20 Javascript
jQuery AJAX 方法success()后台传来的4种数据详解
2018/08/08 jQuery
解决layer.msg 不居中 ifram中的问题
2019/09/05 Javascript
layui表格数据复选框回显设置方法
2019/09/13 Javascript
基于Vue中使用节流Lodash throttle详解
2019/10/30 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
2019/11/25 Javascript
[53:20]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 VG vs OG
2018/04/03 DOTA
Python排序算法实例代码
2017/08/10 Python
Python如何筛选序列中的元素的方法实现
2019/07/15 Python
python实现WebSocket服务端过程解析
2019/10/18 Python
Django通用类视图实现忘记密码重置密码功能示例
2019/12/17 Python
jupyter notebook 的工作空间设置操作
2020/04/20 Python
德国柯吉澳趣味家居:Koziol
2017/08/24 全球购物
学院领导推荐信
2013/10/30 职场文书
董事长岗位职责
2013/11/30 职场文书
小区消防演习方案
2014/02/21 职场文书
个人合作协议书范本
2014/04/18 职场文书
电子信息工程自荐信
2014/05/26 职场文书
校园学雷锋广播稿
2014/10/08 职场文书
小程序实现筛子抽奖
2021/05/26 Javascript