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 相关文章推荐
扩展JS Date对象时间格式化功能的小例子
Dec 02 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
Oct 19 Javascript
DOM 事件的深入浅出(一)
Dec 05 Javascript
AngularJS路由实现页面跳转实例
Mar 03 Javascript
利用vue开发一个所谓的数独方法实例
Dec 21 Javascript
Vue入门之数据绑定(小结)
Jan 08 Javascript
Postman的下载及安装教程详解
Oct 16 Javascript
JS与SQL方式随机生成高强度密码示例
Dec 29 Javascript
JavaScript闭包与作用域链实例分析
Jan 21 Javascript
微信公众号获取用户地理位置并列出附近的门店的示例代码
Jul 25 Javascript
vue实现输入框的模糊查询的示例代码(节流函数的应用场景)
Sep 01 Javascript
js实现左右轮播图
Jan 09 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
thinkphp3查询mssql数据库乱码解决方法分享
2014/02/11 PHP
PHP框架Swoole定时器Timer特性分析
2014/08/19 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
2015/12/14 PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
2019/09/12 PHP
Js中的onblur和onfocus事件应用介绍
2013/08/27 Javascript
JavaScript通过正则表达式实现表单验证电话号码
2014/03/07 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
JavaScript模拟重力状态下抛物运动的方法
2015/03/03 Javascript
JavaScript中的fontsize()方法使用详解
2015/06/08 Javascript
JQuery中DOM加载与事件执行实例分析
2015/06/13 Javascript
深入理解jquery中的事件与动画
2016/05/24 Javascript
Vue如何引入远程JS文件
2017/04/20 Javascript
javascript编程开发中取色器及封装$函数用法示例
2017/08/09 Javascript
利用chrome浏览器进行js调试并找出元素绑定的点击事件详解
2021/01/30 Javascript
Vue 监听列表item渲染事件方法
2018/09/06 Javascript
Angular使用Restful的增删改
2018/12/28 Javascript
详解vue项目中实现图片裁剪功能
2019/06/07 Javascript
Vue中Table组件行内右键菜单实现方法(基于 vue + AntDesign)
2019/11/21 Javascript
jQuery实现动态加载瀑布流
2020/09/01 jQuery
Python创建系统目录的方法
2015/03/11 Python
python执行get提交的方法
2015/04/29 Python
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
2016/05/17 Python
浅析python递归函数和河内塔问题
2017/04/18 Python
Python基于win32ui模块创建弹出式菜单示例
2018/05/09 Python
python实现趣味图片字符化
2019/04/30 Python
如何基于Python制作有道翻译小工具
2019/12/16 Python
python程序需要编译吗
2020/06/19 Python
Python根据字典的值查询出对应的键的方法
2020/09/30 Python
使用CSS3制作响应式导航菜单的方法
2015/07/12 HTML / CSS
英国领先的家庭时尚品牌:Peacocks
2018/01/11 全球购物
Timberland法国官网:购买靴子、鞋子、衣服、夹克和配饰
2019/11/30 全球购物
软件缺陷的分类都有哪些
2014/08/22 面试题
测绘工程专业个人自我评价
2013/12/01 职场文书
宿舍使用违章电器检讨书
2014/01/12 职场文书
2014年单位植树节活动方案
2014/03/23 职场文书
大学生读书笔记大全
2015/07/01 职场文书