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 相关文章推荐
将RTF格式的文件转成HTML并在网页中显示的代码
Oct 09 PHP
zend framework多模块多布局配置
Feb 26 PHP
php模拟socket一次连接,多次发送数据的实现代码
Jul 26 PHP
php无限分类且支持输出树状图的详细介绍
Jun 19 PHP
php实现压缩多个CSS与JS文件的方法
Nov 11 PHP
PHP处理postfix邮件内容的方法
Jun 16 PHP
thinkphp3.2中实现phpexcel导出带生成图片示例
Feb 14 PHP
完美解决thinkphp唯一索引重复时出错的问题
Mar 31 PHP
php微信分享到朋友圈、QQ、朋友、微博
Feb 18 PHP
解决Laravel无法使用COOKIE和SESSION的问题
Oct 16 PHP
PHP 图片合成、仿微信群头像的方法示例
Oct 25 PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
Apr 27 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之第四天
2006/10/09 PHP
PHP4和PHP5性能测试和对比 测试代码与环境
2007/08/17 PHP
MySql数据库查询结果用表格输出PHP代码示例
2015/03/20 PHP
PHP CURL 多线程操作代码实例
2015/05/13 PHP
[原创]smarty简单模板变量输出方法
2016/07/09 PHP
总结PHP中DateTime的常用方法
2016/08/11 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
ext form 表单提交数据的方法小结
2008/08/08 Javascript
如何用JavaScript动态呼叫函数(两种方式)
2013/05/03 Javascript
微信小程序 picker-view 组件详解及简单实例
2017/01/10 Javascript
JavaScript正则替换HTML标签功能示例
2017/03/02 Javascript
详解vue表单验证组件 v-verify-plugin
2017/04/19 Javascript
JS+Canvas绘制动态时钟效果
2017/11/10 Javascript
详解layui弹窗父子窗口之间传参数的方法
2018/01/16 Javascript
详解如何实现一个简单的 vuex
2018/02/10 Javascript
Angular2之二级路由详解
2018/08/31 Javascript
vue制作toast组件npm包示例代码
2020/10/29 Javascript
[01:55]TI9显影之尘系列 - Evil Geniuses
2019/08/22 DOTA
[42:24]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第三场 11.27
2020/12/01 DOTA
Python实现的飞速中文网小说下载脚本
2015/04/23 Python
Python中super关键字用法实例分析
2015/05/28 Python
Python实现将Excel转换成为image的方法
2018/10/23 Python
python使用pymongo操作mongo的完整步骤
2019/04/13 Python
计算机二级python学习教程(1) 教大家如何学习python
2019/05/16 Python
如何基于matlab相机标定导出xml文件
2020/11/02 Python
Python3读写ini配置文件的示例
2020/11/06 Python
css3中less实现文字长阴影(long shadow)
2020/04/24 HTML / CSS
德国BA保镖药房韩文网:kr.ba.de
2017/09/04 全球购物
菲律宾最大的网上花店和礼品店:PhilFlower.com
2018/02/09 全球购物
HomeAway的巴西品牌:Alugue Temporada
2018/04/10 全球购物
苹果台湾官网:Apple台湾
2019/01/05 全球购物
幼儿园义卖活动方案
2014/01/17 职场文书
电子信息工程专业自荐书
2014/06/24 职场文书
导游词欢迎词
2015/02/02 职场文书
三好学生主要事迹怎么写
2015/11/03 职场文书
卖车协议书范文
2016/03/23 职场文书