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 设计模式 富有表现力的Javascript(一)
May 26 Javascript
使用jquery.qrcode生成彩色二维码实例
Aug 08 Javascript
jQuery使用hide方法隐藏元素自身用法实例
Mar 30 Javascript
JavaScript中constructor()方法的使用简介
Jun 05 Javascript
原生JS和jQuery版实现文件上传功能
Apr 18 Javascript
怎么限制input的text里输入的值只能是数字(正则、js)
May 16 Javascript
JavaScript基于原型链的继承
Jun 22 Javascript
js链表操作(实例讲解)
Aug 29 Javascript
Node.js中DNS模块学习总结
Feb 28 Javascript
JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍
Mar 01 Javascript
JavaScript刷新页面的几种方法总结
Mar 28 Javascript
JS用最简单的方法实现四舍五入
Aug 27 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
冰滴咖啡制作步骤
2021/03/03 冲泡冲煮
PHP的几个常用加密函数
2016/02/03 PHP
JavaScript 嵌套函数指向this对象错误的解决方法
2010/03/15 Javascript
js 在定义的时候立即执行的函数表达式(function)写法
2013/01/16 Javascript
javascript读写XML实现广告轮换(兼容IE、FF)
2013/08/09 Javascript
基于jquery的9行js轻松实现tab控件示例
2013/10/12 Javascript
jQuery判断checkbox是否选中的小例子
2013/12/02 Javascript
jQuery实现滚动切换的tab选项卡效果代码
2015/08/26 Javascript
JS+CSS实现简易的滑动门效果代码
2015/09/24 Javascript
JavaScript函数的一些注意要点小结及js匿名函数
2015/11/10 Javascript
jQuery中attr()与prop()函数用法实例详解(附用法区别)
2015/12/29 Javascript
学习Angular中作用域需要注意的坑
2016/08/17 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
2016/09/02 Javascript
JavaScript高仿支付宝倒计时页面及代码实现
2016/10/21 Javascript
使用Bootstrap美化按钮实例代码(demo)
2017/02/03 Javascript
微信小程序 出现错误:{&quot;baseresponse&quot;:{&quot;errcode&quot;:-80002,&quot;errmsg&quot;:&quot;&quot;}}解决办法
2017/02/23 Javascript
使用jquery datatable和bootsrap创建表格实例代码
2017/03/17 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
2017/04/13 Javascript
Javascript实现倒计时时差效果
2017/05/18 Javascript
详解用函数式编程对JavaScript进行断舍离
2017/09/18 Javascript
值得收藏的vuejs安装教程
2017/11/21 Javascript
Vue解析带html标签的字符串为dom的实例
2019/11/13 Javascript
基于JavaScript实现贪吃蛇游戏
2020/03/16 Javascript
vue中渲染对象中属性时显示未定义的解决
2020/07/31 Javascript
Python中一行和多行import模块问题
2018/04/01 Python
Sanic框架Cookies操作示例
2018/07/17 Python
Django基于Models定制Admin后台实现过程解析
2020/11/11 Python
css3 自定义字体font-face使用介绍
2014/05/14 HTML / CSS
HTML5 Canvas中使用用路径描画圆弧
2015/01/01 HTML / CSS
世界上最具创新性的增强型知名运动品牌:Proviz
2018/04/03 全球购物
社区庆八一活动方案
2014/02/02 职场文书
酒店端午节促销方案
2014/02/18 职场文书
世界红十字日活动总结
2015/02/10 职场文书
2015年精神文明建设工作总结
2015/04/21 职场文书
关于空气污染危害的感想
2015/08/11 职场文书
24年收藏2000多部退役军用电台
2022/02/18 无线电