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 相关文章推荐
PHP 时间转换Unix时间戳代码
Jan 22 PHP
PHP实现多条件查询实例代码
Jul 17 PHP
PHP中英混合字符串截取函数代码
Jul 17 PHP
PHP得到mssql的存储过程的输出参数功能实现
Nov 23 PHP
php设计模式之观察者模式的应用详解
May 21 PHP
深入PHP运行环境配置的详解
Jun 04 PHP
php读取csv实现csv文件下载功能
Dec 18 PHP
THINKPHP内容分页代码分享
Jan 14 PHP
PHP易混淆知识整理笔记
Sep 24 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
Nov 20 PHP
浅析PHP类的反射来实现依赖注入过程
Feb 06 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
Feb 07 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和ACCESS写聊天室(三)
2006/10/09 PHP
php断点续传之如何分割合并文件
2014/03/22 PHP
PHP中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
smarty高级特性之过滤器的使用方法
2015/12/25 PHP
PHP的Laravel框架结合MySQL与Redis数据库的使用部署
2016/03/21 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
PHP中如何使用Redis接管文件存储Session详解
2018/11/28 PHP
判断多个input type=file是否有已经选择好文件的代码
2012/05/23 Javascript
jQuery的slideToggle方法实例
2013/05/07 Javascript
如何用JavaScript定义一个类
2014/09/12 Javascript
javascript拖拽效果延伸学习
2016/04/04 Javascript
JavaScript实现简单的日历效果
2016/09/25 Javascript
Vue.js教程之计算属性
2016/11/11 Javascript
jQuery中的select操作详解
2016/11/29 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
2016/11/30 Javascript
Element 默认勾选表格 toggleRowSelection的实现
2019/09/04 Javascript
js 实现碰撞检测的示例
2020/10/28 Javascript
[01:05]DOTA2完美大师赛趣味视频之选手教你打职业
2017/11/23 DOTA
[29:16]完美世界DOTA2联赛决赛日 Inki vs LBZS 第三场 11.08
2020/11/10 DOTA
[01:03:36]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第二场 1月26日
2021/03/11 DOTA
Python快速排序算法实例分析
2017/11/29 Python
python实现简单五子棋游戏
2019/06/18 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
2019/09/25 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
2020/11/13 Python
python 实现socket服务端并发的四种方式
2020/12/14 Python
CSS中垂直居中的简单实现方法
2015/07/06 HTML / CSS
HTML5标签大全
2016/11/23 HTML / CSS
基于Html5 canvas实现裁剪图片和马赛克功能及又拍云上传图片 功能
2019/07/09 HTML / CSS
英国领先的维生素和营养补充剂直接供应商:Healthspan
2019/04/22 全球购物
毕业生就业自荐信
2013/12/04 职场文书
幼儿园六一活动总结
2014/08/27 职场文书
领导班子四风对照检查材料思想汇报
2014/09/26 职场文书
学生穿着不得体检讨书
2014/10/12 职场文书
水浒传读书笔记
2015/06/25 职场文书
留学文书中的个人陈述,应该注意哪些问题?
2019/08/23 职场文书
详解Nginx 工作原理
2021/03/31 Servers