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 相关文章推荐
最新28个很棒的jQuery 教程
May 28 Javascript
鼠标滚轮改变图片大小的示例代码
Nov 20 Javascript
javascript生成随机大小写字母的方法
Feb 20 Javascript
js判断鼠标左、中、右键哪个被点击的方法
Jan 27 Javascript
纯JavaScript手写图片轮播代码
Oct 20 Javascript
详解JavaScript中js对象与JSON格式字符串的相互转换
Feb 14 Javascript
javascript 中关于array的常用方法详解
May 05 Javascript
vue中阻止click事件冒泡,防止触发另一个事件的方法
Feb 08 Javascript
JavaScript作用域、闭包、对象与原型链概念及用法实例总结
Aug 20 Javascript
angular4应用中输入的最小值和最大值的方法
May 17 Javascript
高效jQuery选择器的5个技巧实例分析
Nov 26 jQuery
解决Vue 给mapState中定义的属性赋值报错的问题
Jun 22 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
CodeIgniter基于Email类发邮件的方法
2016/03/29 PHP
javascript实现的鼠标链接提示效果生成器代码
2007/06/28 Javascript
javascript+xml技术实现分页浏览
2008/07/27 Javascript
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
css值转换成数值请抛弃parseInt
2011/10/24 Javascript
JS代码判断IE6,IE7,IE8,IE9的函数代码
2013/08/02 Javascript
Bootstrap选项卡动态切换效果
2016/11/28 Javascript
详解Jquery的事件操作和文档操作
2016/12/19 Javascript
JS简单验证上传文件类型的方法
2017/04/17 Javascript
前端主流框架vue学习笔记第二篇
2017/07/26 Javascript
Vue-Router模式和钩子的用法
2018/02/28 Javascript
基于Vue实现关键词实时搜索高亮显示关键词
2018/07/21 Javascript
react同构实践之实现自己的同构模板
2019/03/13 Javascript
js实现鼠标拖拽缩放div实例代码
2019/03/25 Javascript
使用异步组件优化Vue应用程序的性能
2019/04/28 Javascript
js将URL网址转为16进制加密与解密函数
2020/03/04 Javascript
使用vue cli4.x搭建vue项目的过程详解
2020/05/08 Javascript
ES6 async、await的基本使用方法示例
2020/06/06 Javascript
Python基础之函数用法实例详解
2014/09/10 Python
python实现简单ftp客户端的方法
2015/06/28 Python
Python判断两个对象相等的原理
2017/12/12 Python
python3+PyQt5自定义视图详解
2018/04/24 Python
浅谈python连续赋值可能引发的错误
2018/11/10 Python
用python脚本24小时刷浏览器的访问量方法
2018/12/07 Python
Python读写csv文件流程及异常解决
2020/10/20 Python
英国在线药房:Chemist.co.uk
2019/03/26 全球购物
什么是动态端口(Dynamic Ports)?动态端口的范围是多少?
2014/12/12 面试题
优秀毕业生自荐信范文
2014/01/01 职场文书
年会活动策划方案
2014/01/23 职场文书
中文专业学生自我评价范文
2014/02/06 职场文书
公司员工检讨书
2014/02/08 职场文书
《值日生》教学反思
2014/02/17 职场文书
中学生寄语大全
2014/04/03 职场文书
五好家庭事迹材料
2014/12/20 职场文书
Python中的套接字编程是什么?
2021/06/21 Python
用Python可视化新冠疫情数据
2022/01/18 Python