php基于redis处理session的方法


Posted in Javascript onMarch 14, 2016

一个基于redis的处理session的方法,如下。

<?php
class Session_custom {
  private $redis; // redis实例
  private $prefix = 'sess_'; // session_id前缀
  
  // 会话开始时,会执行该方法,连接redis服务器
  public function open($path, $name) {
    $this->redis = new Redis();
    return $this->redis->connect("127.0.0.1",6379);
  }
  
  // 会话结束时,调用该方法,关闭redis连接
  public function close() {
    $this->redis->close();
    return true;
  }
  
  // 会话保存数据时调用该方法,在脚本执行完或session_write_close方法调用之后调用
  public function write($session_id, $data) {
    return $this->redis->hMSet($this->prefix.$session_id, array('expires' => time(), 'data' => $data));
  }
  
  // 在自动开始会话或者通过调用 session_start() 函数手动开始会话之后,PHP 内部调用 read 回调函数来获取会话数据。
  public function read($session_id) {
    if($this->redis->exists($this->prefix.$session_id)) {
      return $this->redis->hGet($this->prefix.$session_id, 'data');
    }
    return '';
  }
  
  // 清除会话中的数据,当调用session_destroy()函数,或者调用 session_regenerate_id()函数并且设置 destroy 参数为 TRUE 时,会调用此回调函数。
  public function destroy($session_id) {
    if($this->redis->exists($this->prefix.$session_id)) {
      return $this->redis->del($this->prefix.$session_id) > 0 ? true : false;
    }
    return true;
  }
  
  // 垃圾回收函数,调用周期由 session.gc_probability 和 session.gc_divisor 参数控制
  public function gc($maxlifetime) {
    $allKeys = $this->redis->keys("{$this->prefix}*");
    foreach($allKeys as $key) {
      if($this->redis->exists($key) && $this->redis->hGet($key, 'expires') + $maxlifetime < time()) {
        $this->redis->del($key);
      }
    }
    return true;
  }
}

// 调用自定义的session处理方法
$handler = new Session_custom();
session_set_save_handler(
  array($handler, 'open'),
  array($handler, 'close'),
  array($handler, 'read'),
  array($handler, 'write'),
  array($handler, 'destroy'),
  array($handler, 'gc')
);

// 下面这行代码可以防止使用对象作为会话保存管理器时可能引发的非预期行为,表示当脚本执行之后或调用exit()之后,存储当前会话数据并关闭当前会话
register_shutdown_function('session_write_close');

session_start();

// 可以使用session了

补充:

php.ini文件中的session.gc_probability与session.gc_divisor两个配置选项共同决定gc函数调用的时机。默认值分为为1和1000,表示每个请求只有1/1000的机会调用gc函数。

以上就是本文的全部内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
javascript延时重复执行函数 lLoopRun.js
Jun 29 Javascript
js加载之使用DOM方法动态加载Javascript文件
Nov 08 Javascript
javascript工厂模式和构造函数模式创建对象方法解析
Dec 30 Javascript
jQuery Mobile漏洞会有跨站脚本攻击风险
Feb 12 Javascript
vue系列之requireJs中引入vue-router的方法
Jul 18 Javascript
微信小程序使用map组件实现检索(定位位置)周边的POI功能示例
Jan 23 Javascript
详解使用React制作一个模态框
Mar 14 Javascript
Vue 指令实现按钮级别权限管理功能
Apr 23 Javascript
JavaScript使用面向对象实现的拖拽功能详解
Jun 12 Javascript
cordova+vue+webapp使用html5获取地理位置的方法
Jul 06 Javascript
如何实现iframe父子传参通信
Feb 05 Javascript
JavaScript实现好看的跟随彩色气泡效果
Feb 06 Javascript
使用javascript插入样式
Mar 14 #Javascript
jQuery实现百叶窗焦点图动画效果代码分享(附源码下载)
Mar 14 #Javascript
javascript实现数组去重的多种方法
Mar 14 #Javascript
javascript实现PC网页里的拖拽效果
Mar 14 #Javascript
Jquery实现简单的轮播效果(代码管用)
Mar 14 #Javascript
node模块机制与异步处理详解
Mar 13 #Javascript
JS中创建函数的三种方式及区别
Mar 13 #Javascript
You might like
PHP的历史和优缺点
2006/10/09 PHP
WindowsXP中快速配置Apache+PHP5+Mysql
2008/06/05 PHP
php与paypal整合方法
2010/11/28 PHP
thinkphp常见路径用法分析
2014/12/02 PHP
总结对比php中的多种序列化
2016/08/28 PHP
laravel 中如何使用ajax和vue总结
2017/08/16 PHP
超级有用的13个基于jQuery的内容滚动插件和教程
2011/07/31 Javascript
Prototype的Class.create函数解析
2011/09/22 Javascript
extjs 04_grid 单击事件新发现
2012/11/27 Javascript
JS小功能(offsetLeft实现图片滚动效果)实例代码
2013/11/28 Javascript
jquery让指定的元素闪烁显示的方法
2015/03/17 Javascript
js实现二级菜单渐隐显示
2015/11/03 Javascript
jQuery EasyUI常用数据验证汇总
2016/09/18 Javascript
AngularJS全局scope与Isolate scope通信用法示例
2016/11/22 Javascript
BootStrap fileinput.js文件上传组件实例代码
2017/02/20 Javascript
js实现随机点名小功能
2017/08/17 Javascript
在vue中使用jointjs的方法
2018/03/24 Javascript
利用Dectorator分模块存储Vuex状态的实现
2019/02/05 Javascript
js实现一个简易计算器
2020/03/30 Javascript
Python socket C/S结构的聊天室应用实现
2014/11/30 Python
一篇文章入门Python生态系统(Python新手入门指导)
2015/12/11 Python
Python 专题四 文件基础知识
2017/03/20 Python
使用python爬取抖音视频列表信息
2019/07/15 Python
pytorch 模型可视化的例子
2019/08/17 Python
将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例
2020/01/04 Python
Python模块zipfile原理及使用方法详解
2020/08/04 Python
英国领先的名牌服装折扣零售商:Brown Bag Clothing
2019/01/08 全球购物
介绍一下linux的文件系统
2012/03/20 面试题
工程专业应届生求职信
2014/02/19 职场文书
2014年端午节演讲稿范文
2014/05/23 职场文书
2015学生会文艺部工作总结
2015/04/03 职场文书
2016年大学生暑假爱心支教活动策划书
2015/11/26 职场文书
redis 存储对象的方法对比分析
2021/08/02 Redis
Mysql数据库表中为什么有索引却没有提高查询速度
2022/02/24 MySQL
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电
Redis 限流器
2022/05/15 Redis