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 相关文章推荐
PHP4中实现动态代理
Oct 09 PHP
动态新闻发布的实现及其技巧
Oct 09 PHP
PHP学习笔记 用户注册模块用户类以及验证码类
Sep 20 PHP
CI框架Session.php源码分析
Nov 03 PHP
PHP动态页生成静态页的3种常用方法
Nov 13 PHP
PHP中使用匿名函数操作数据库的例子
Nov 17 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
Sep 15 PHP
浅谈PHP无限极分类原理
Mar 14 PHP
PHP实现网站应用微信登录功能详解
Apr 11 PHP
PHP抽象类和接口用法实例详解
Jul 20 PHP
使用Laravel中的查询构造器实现增删改查功能
Sep 03 PHP
PHP cookie与session会话基本用法实例分析
Nov 18 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 检查扩展库或函数是否可用的代码
2010/04/06 PHP
php获取mysql数据库中的所有表名的代码
2011/04/23 PHP
php 数组动态添加实现代码(最土团购系统的价格排序)
2011/12/30 PHP
PHP PDOStatement::columnCount讲解
2019/01/30 PHP
一个高效的JavaScript压缩工具下载集合
2007/03/06 Javascript
一些不错的js函数ajax
2008/08/20 Javascript
Javascript控制页面链接在新窗口打开具体方法
2013/08/16 Javascript
node.js中的fs.close方法使用说明
2014/12/17 Javascript
JavaScript里实用的原生API汇总
2015/05/14 Javascript
基于JS实现数字+字母+中文的混合排序方法
2016/06/06 Javascript
jquery动态创建div与input的实例代码
2016/10/12 Javascript
值得学习的bootstrap fileinput文件上传工具
2016/11/08 Javascript
根据Bootstrap Paginator改写的js分页插件
2016/12/25 Javascript
AngularJS中的按需加载ocLazyLoad示例
2017/01/11 Javascript
简单谈谈gulp-changed插件
2017/02/21 Javascript
bootstrap时间插件daterangepicker使用详解
2017/10/19 Javascript
node.js中fs文件系统模块的使用方法实例详解
2020/02/13 Javascript
js实现简单抽奖功能
2020/11/24 Javascript
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
[01:11:28]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第一场 1月8日
2021/03/11 DOTA
Python调用C++程序的方法详解
2017/01/24 Python
python编程之requests在网络请求中添加cookies参数方法详解
2017/10/25 Python
Python函数装饰器常见使用方法实例详解
2019/03/30 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
2019/05/27 Python
Pyqt5自适应布局实例
2019/12/13 Python
Python自动巡检H3C交换机实现过程解析
2020/08/14 Python
解释一下Windows的消息机制
2014/01/30 面试题
环保建议书300字
2014/05/14 职场文书
2014最新毕业证代领委托书
2014/09/26 职场文书
再婚婚前财产协议书范本
2014/10/19 职场文书
房屋买卖协议样本
2014/11/16 职场文书
捐助倡议书
2015/01/19 职场文书
《卧薪尝胆》读后感3篇
2019/12/26 职场文书
Python利用folium实现地图可视化
2021/05/23 Python
vue中使用mockjs配置和使用方式
2022/04/06 Vue.js
python中 Flask Web 表单的使用方法
2022/05/20 Python