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读取IMAP邮件
Oct 09 PHP
聊天室php&amp;mysql(一)
Oct 09 PHP
PHP cdata 处理(详细介绍)
Jul 05 PHP
百度ping方法使用示例 自动ping百度
Jan 26 PHP
php使用socket post数据到其它web服务器的方法
Jun 02 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
Dec 31 PHP
php基于闭包实现函数的自调用(递归)实例分析
Nov 11 PHP
php获取linux命令结果的实例
Mar 13 PHP
Eclipse PHPEclipse 配置的具体步骤
Aug 08 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
Feb 27 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
Dec 29 PHP
PHP执行系统命令函数实例讲解
Mar 03 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设置图片文件上传大小的具体实现方法
2013/10/11 PHP
你可能不知道PHP get_meta_tags()函数
2014/05/12 PHP
修改PHP脚本使WordPress拦截垃圾评论的方法示例
2015/12/10 PHP
php实现的中文分词类完整实例
2017/02/06 PHP
jquery Mobile入门—外部链接切换示例代码
2013/01/08 Javascript
关于JS管理作用域的问题
2013/04/10 Javascript
jQuery 关于伪类选择符的使用说明
2013/04/24 Javascript
浅谈JS日期(Date)处理函数
2014/12/07 Javascript
jQuery中removeData()方法用法实例
2014/12/27 Javascript
JavaScript控制table某列不显示的方法
2015/03/16 Javascript
Angularjs中的ui-bootstrap的使用教程
2017/02/19 Javascript
js简单实现网页换肤功能
2017/04/07 Javascript
JavaScript中this关键字用法实例分析
2018/08/24 Javascript
vue实现点击选中,其他的不选中方法
2018/09/05 Javascript
使用JavaScript破解web
2018/09/28 Javascript
深入理解webpack process.env.NODE_ENV配置
2020/02/23 Javascript
JS实现烟花爆炸效果
2020/03/10 Javascript
详解JavaScript数据类型和判断方法
2020/09/04 Javascript
vuex的使用和简易实现
2021/01/07 Vue.js
利用Python3分析sitemap.xml并抓取导出全站链接详解
2017/07/04 Python
Python中支持向量机SVM的使用方法详解
2017/12/26 Python
Tensorflow之Saver的用法详解
2018/04/23 Python
Python 如何优雅的将数字转化为时间格式的方法
2019/09/26 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
2019/10/17 Python
通过 Django Pagination 实现简单分页功能
2019/11/11 Python
JupyterNotebook设置Python环境的方法步骤
2019/12/03 Python
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
2015年初中元旦晚会活动总结
2014/11/28 职场文书
财务人员个人工作总结
2015/02/27 职场文书
2015年超市工作总结
2015/04/09 职场文书
婚宴来宾致辞
2015/07/28 职场文书
2016教师学习党章心得体会
2016/01/15 职场文书
企业管理不到位检讨书
2019/06/27 职场文书
Java输出Hello World完美过程解析
2021/06/13 Java/Android
Mysql存储过程、触发器、事件调度器使用入门指南
2022/01/22 MySQL
Win11 Beta 22621.601 和 22622.601今日发布 KB5017384修复内容汇总
2022/09/23 数码科技