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 相关文章推荐
综合图片计数器
Oct 09 PHP
php 异常处理实现代码
Mar 10 PHP
The specified CGI application misbehaved by not returning a complete set of HTTP headers
Mar 31 PHP
php高级编程-函数-郑阿奇
Jul 04 PHP
php获取中文拼音首字母类和函数分享
Apr 24 PHP
php 模拟 asp.net webFrom 按钮提交事件实例
Oct 13 PHP
smarty内置函数foreach用法实例
Jan 22 PHP
利用PHP如何实现Socket服务器
Sep 23 PHP
详解PHP的Yii框架中日志的相关配置及使用
Dec 08 PHP
php文件上传及下载附带显示文件及目录功能
Apr 27 PHP
php 数据结构之链表队列
Oct 17 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
Apr 06 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中全局变量global的使用演示代码
2011/05/18 PHP
PHP使用ActiveMQ实现消息队列的方法详解
2019/05/31 PHP
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
2019/06/12 PHP
JavaScript国旗变换效果代码
2008/08/13 Javascript
JQuery实现倒计时按钮具体方法
2013/11/14 Javascript
jQuery之字体大小的设置方法
2014/02/27 Javascript
Javascript单元测试框架QUnitjs详细介绍
2014/05/08 Javascript
javascript加载xml 并解析各节点的值(实现方法)
2016/10/12 Javascript
Node.js使用orm2进行update操作时关联字段无法修改的解决方法
2017/06/13 Javascript
JavaScript贪吃蛇小组件实例代码
2017/08/20 Javascript
vue+webpack中配置ESLint
2018/11/07 Javascript
如何自动化部署项目?折腾服务器之旅~
2019/04/16 Javascript
js HTML DOM EventListener功能与用法实例分析
2020/04/27 Javascript
Vue 同步异步存值取值实现案例
2020/08/05 Javascript
js实现弹幕飞机效果
2020/08/27 Javascript
vue 微信分享回调iOS和安卓回调出现错误的解决
2020/09/07 Javascript
js实现网页随机验证码
2020/10/19 Javascript
Vue全局使用less样式,组件使用全局样式文件中定义的变量操作
2020/10/21 Javascript
Python调用命令行进度条的方法
2015/05/05 Python
python定向爬虫校园论坛帖子信息
2018/07/23 Python
利用pandas读取中文数据集的方法
2018/07/25 Python
在python中用print()输出多个格式化参数的方法
2019/07/16 Python
Python类的继承super相关原理解析
2020/10/22 Python
python openpyxl模块的使用详解
2021/02/25 Python
服装厂厂长职责
2013/12/16 职场文书
党员干部2014全国两会学习心得体会
2014/03/10 职场文书
《金孔雀轻轻跳》教学反思
2014/04/20 职场文书
先进员工获奖感言
2014/08/14 职场文书
2014党员学习《反腐倡廉警示教育读本》思想汇报
2014/09/13 职场文书
2014年重阳节老干部座谈会局领导发言稿
2014/09/25 职场文书
公司仓管员岗位职责
2015/04/01 职场文书
外贸采购员岗位职责
2015/04/03 职场文书
2016年元旦寄语
2015/08/17 职场文书
Python虚拟环境virtualenv是如何使用的
2021/06/20 Python
深入理解CSS 中 transform matrix矩阵变换问题
2021/08/30 HTML / CSS
一文彻底理解js原生语法prototype,__proto__和constructor
2021/10/24 Javascript