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与XML的PDF文档生成技术
Oct 09 PHP
php与php MySQL 之间的关系
Jul 17 PHP
JSON在PHP中的应用介绍
Sep 08 PHP
使用php实现下载生成某链接快捷方式的解决方法
May 07 PHP
php实现的百度搜索某地天气的小偷代码
Apr 23 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
Oct 15 PHP
PHP实现原比例生成缩略图的方法
Feb 03 PHP
thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
Sep 30 PHP
PHP Header失效的原因分析及解决方法
Nov 16 PHP
PHP实现的XML操作类【XML Library】
Dec 29 PHP
Laravel中unique和exists验证规则的优化详解
Jan 28 PHP
不常用但很实用的PHP预定义变量分析
Jun 25 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 获取客户端的真实ip
2009/11/30 PHP
PHP file_exists问题杂谈
2012/05/07 PHP
php cli 小技巧
2013/06/03 PHP
ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
2014/06/26 PHP
php打印一个边长为N的实心和空心菱型的方法
2015/03/02 PHP
php简单获取目录列表的方法
2015/03/24 PHP
在Debian系统下配置LNMP的教程
2015/07/09 PHP
php文件上传、下载和删除示例
2020/08/28 PHP
在laravel中使用Symfony的Crawler组件分析HTML
2017/06/19 PHP
JavaScript事件列表解说
2006/12/22 Javascript
javascript实现的网页局布刷新效果
2008/12/01 Javascript
详解JavaScript对象序列化
2016/01/19 Javascript
js实现不重复导入的方法
2016/03/02 Javascript
深入理解jQuery layui分页控件的使用
2016/08/17 Javascript
echarts学习笔记之图表自适应问题详解
2017/11/22 Javascript
javascript获取图片的top N主色值方法详解
2018/01/26 Javascript
浅谈Javascript常用正则表达式应用
2019/03/08 Javascript
vue实现文字加密功能
2019/09/27 Javascript
react结合bootstrap实现评论功能
2020/05/30 Javascript
python回调函数的使用方法
2014/01/23 Python
Python捕捉和模拟鼠标事件的方法
2015/06/03 Python
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
Python Json模块中dumps、loads、dump、load函数介绍
2018/05/15 Python
运行Python编写的程序方法实例
2020/10/21 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
2020/10/22 Python
python实现b站直播自动发送弹幕功能
2021/02/20 Python
英国花园药房: The Garden Pharmacy
2017/12/28 全球购物
警察思想汇报
2014/01/04 职场文书
结婚典礼证婚词
2014/01/08 职场文书
党的群众路线对照检查材料
2014/09/22 职场文书
检讨书模板
2015/01/29 职场文书
学术会议邀请函
2015/01/30 职场文书
求职自荐信怎么写
2015/03/04 职场文书
逃课检讨书范文
2015/05/06 职场文书
大学新生入学感想
2015/08/07 职场文书
会议主持词通用版
2019/04/02 职场文书