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实现二分查找算法代码分享
Jun 24 PHP
用来解析.htpasswd文件的PHP类
Sep 05 PHP
测试PHP连接MYSQL成功与否的代码
Aug 16 PHP
美图秀秀web开放平台--PHP流式上传和表单上传示例分享
Jun 22 PHP
PHP Session机制简介及用法
Aug 19 PHP
php面象对象数据库操作类实例
Dec 02 PHP
php将图片保存入mysql数据库失败的解决方法
Dec 27 PHP
thinkPHP使用post方式查询时分页失效的解决方法
Dec 09 PHP
全面解析PHP面向对象的三大特征
Jun 10 PHP
PHP文字转图片功能原理与实现方法分析
Aug 31 PHP
PHP自动生成缩略图函数的源码示例
Mar 18 PHP
PHP CURL使用详解
Mar 21 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显示今天、今月、上月、今年的起点/终点时间戳的代码
2011/05/25 PHP
采用header定义为文件然后readfile下载(隐藏下载地址)
2014/01/31 PHP
推荐十款免费 WordPress 插件
2015/03/24 PHP
php实现替换手机号中间数字为*号及隐藏IP最后几位的方法
2016/11/16 PHP
Javascript 模式实例 观察者模式
2009/10/24 Javascript
解决Extjs上传图片无法预览的解决方法
2012/03/22 Javascript
js中点击空白区域时文本框与隐藏层的显示与影藏问题
2013/08/26 Javascript
js整数字符串转换为金额类型数据(示例代码)
2013/12/26 Javascript
用html5 js实现点击一个按钮达到浏览器全屏效果
2014/05/28 Javascript
老生常谈原生JS执行环境与作用域
2016/11/22 Javascript
vue webpack打包后图片路径错误的完美解决方法
2018/12/07 Javascript
如何基于filter实现网站整体变灰功能
2020/04/17 Javascript
一文秒懂JavaScript构造函数、实例、原型对象以及原型链
2020/08/25 Javascript
js在HTML的三种引用方式详解
2020/08/29 Javascript
[01:21]2018DOTA2亚洲邀请赛4.5采访 打DOTA2也能有女朋友?
2018/04/06 DOTA
[59:30]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
Python 字符串操作方法大全
2014/03/11 Python
快速排序的算法思想及Python版快速排序的实现示例
2016/07/02 Python
浅谈python numpy中nonzero()的用法
2018/04/02 Python
Python subprocess模块功能与常见用法实例详解
2018/06/28 Python
Python使用POP3和SMTP协议收发邮件的示例代码
2019/04/16 Python
python的内存管理和垃圾回收机制详解
2019/05/18 Python
python3实现微型的web服务器
2019/09/03 Python
解决django model修改添加字段报错的问题
2019/11/18 Python
Python Pillow.Image 图像保存和参数选择方式
2020/01/09 Python
css3 实现元素弧线运动的示例代码
2020/04/24 HTML / CSS
Scholastic父母商店:儿童书籍
2017/01/01 全球购物
大学生创业计划书的用途
2014/01/08 职场文书
绿化先进工作者事迹材料
2014/01/30 职场文书
设计师个人求职信范文
2014/02/02 职场文书
数控专业大学毕业生职业规划范文
2014/02/06 职场文书
奉献演讲稿范文
2014/05/21 职场文书
研究生求职自荐书
2014/06/23 职场文书
赢在执行观后感
2015/06/16 职场文书
文艺演出主持词
2015/07/01 职场文书
Spring Cloud 中@FeignClient注解中的contextId属性详解
2021/09/25 Java/Android