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 高级篇之函数 (四)
Apr 07 Javascript
js确认删除对话框适用于a标签及submit
Jul 10 Javascript
js获取checkbox值的方法
Jan 28 Javascript
JavaScript中字符串(string)转json的2种方法
Jun 25 Javascript
javascript下拉列表菜单的实现方法
Nov 18 Javascript
Bootstrap每天必学之表格
Nov 23 Javascript
探究Javascript模板引擎mustache.js使用方法
Jan 26 Javascript
Node连接mysql数据库方法介绍
Feb 07 Javascript
微信小程序下拉刷新界面的实现
Sep 28 Javascript
Vue页面骨架屏注入方法
May 13 Javascript
Ajax获取node服务器数据的完整步骤
Sep 20 Javascript
js实现电灯开关效果
Jan 19 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中通过ADODB库实现调用Access数据库之修正版本
2006/12/31 PHP
谈谈关于php的优点与缺点
2013/04/11 PHP
php实现文件下载(支持中文文名)
2013/12/04 PHP
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
Codeigniter购物车类不能添加中文的解决方法
2014/11/29 PHP
PHP创建word文档的方法(平台无关)
2016/03/29 PHP
php求斐波那契数的两种实现方式【递归与递推】
2019/09/09 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
用于节点操作的API,颠覆原生操作HTML DOM节点的API
2010/12/11 Javascript
JavaScript中把数字转换为字符串的程序代码
2013/06/19 Javascript
jQuery遍历Form示例代码
2013/09/03 Javascript
js修改原型的属性使用介绍
2014/01/26 Javascript
javascript中expression的用法整理
2014/05/13 Javascript
在Google 地图上实现做的标记相连接
2015/01/05 Javascript
js基础知识(公有方法、私有方法、特权方法)
2015/11/06 Javascript
Angularjs---项目搭建图文教程
2016/07/08 Javascript
Vue.js实现拖放效果的实例
2016/09/30 Javascript
让编辑器支持word复制黏贴、截屏的js代码
2016/10/17 Javascript
Nodejs实现多房间简易聊天室功能
2017/06/20 NodeJs
基于IView中on-change属性的使用详解
2018/03/15 Javascript
详解使用jest对vue项目进行单元测试
2018/09/07 Javascript
node.js使用yargs处理命令行参数操作示例
2020/02/11 Javascript
vue 路由缓存 路由嵌套 路由守卫 监听物理返回操作
2020/08/06 Javascript
微信小程序实现点击导航标签滚动定位到对应位置
2020/11/19 Javascript
python 读写中文json的实例详解
2017/10/29 Python
将python字符串转化成长表达式的函数eval实例
2020/05/11 Python
Python 实现自动登录+点击+滑动验证功能
2020/06/10 Python
html5 的a标签 Href 拨电话的写法
2013/11/04 HTML / CSS
澳大利亚设计师服装在线:MISHA
2019/10/07 全球购物
Fabletics官网:美国运动服饰品牌,由好莱坞女演员凯特·哈德森创立
2019/10/19 全球购物
俄罗斯皮肤健康中心:Pharmacosmetica.ru
2020/02/22 全球购物
JSF如何进行表格处理及取值
2012/08/06 面试题
医学专业本科毕业生自我鉴定
2013/12/28 职场文书
监察建议书范文
2014/03/12 职场文书
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/07 PostgreSQL