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 相关文章推荐
两个SUBMIT按钮,如何区分处理
Aug 22 Javascript
ExtJS4 Grid改变单元格背景颜色及Column render学习
Feb 06 Javascript
JavaScript实现GriwView单列全选(自写代码)
May 13 Javascript
jquery mobile事件多次绑定示例代码
Sep 13 Javascript
js获取指定的cookie的具体实现
Feb 20 Javascript
绑定回车enter事件代码
May 18 Javascript
jquery实现的代替传统checkbox样式插件
Jun 19 Javascript
JS+CSS3实现超炫的散列画廊特效
Jul 16 Javascript
利用JS实现页面删除并重新排序功能
Dec 09 Javascript
详解操作虚拟dom模拟react视图渲染
Jul 25 Javascript
layer.close()关闭进度条和Iframe窗的方法
Aug 17 Javascript
vue中的适配px2rem示例代码
Nov 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使用curl发送json格式数据实例
2013/12/17 PHP
zf框架的zend_cache缓存使用方法(zend框架)
2014/03/14 PHP
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
基于PHP的加载类操作以及其他两种魔术方法的应用实例
2017/08/28 PHP
PHP实现的杨辉三角求解算法分析
2019/03/11 PHP
javascript 动态table添加colspan\rowspan 参数的方法
2009/07/25 Javascript
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
2012/12/19 Javascript
jquery创建一个新的节点对象(自定义结构/内容)的好方法
2013/01/21 Javascript
NodeJS学习笔记之(Url,QueryString,Path)模块
2015/01/13 NodeJs
javascript二维数组转置实例
2015/01/22 Javascript
JS/Jquery判断对象为空的方法
2015/06/11 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
JQuery标签页效果实例详解
2015/12/24 Javascript
javascript嵌套函数和在函数内调用外部函数的区别分析
2016/01/31 Javascript
第二章之Bootstrap 页面排版样式
2016/04/25 Javascript
解析JavaScript中的字符串类型与字符编码支持
2016/06/24 Javascript
功能强大的Bootstrap组件(结合js)
2016/08/03 Javascript
详解vue-cli快速构建项目以及引入bootstrap、jq
2017/05/26 Javascript
vue通过watch对input做字数限定的方法
2017/07/13 Javascript
基于Vue渲染与插件的加载顺序的问题详解
2018/03/05 Javascript
详解vue在项目中使用百度地图
2019/03/26 Javascript
python解析xml文件实例分析
2015/05/27 Python
Python实现字符串逆序输出功能示例
2017/06/24 Python
Django中的ajax请求
2018/10/19 Python
pandas DataFrame创建方法的方式
2019/08/02 Python
opencv resize图片为正方形尺寸的实现方法
2019/12/26 Python
把vgg-face.mat权重迁移到pytorch模型示例
2019/12/27 Python
HTML5的结构和语义(5):内嵌媒体
2008/10/17 HTML / CSS
英国高端食品和葡萄酒超市:Waitrose
2016/08/23 全球购物
Coach澳大利亚官方网站:美国著名时尚奢侈品牌
2017/05/24 全球购物
馥蕾诗美国官网:Fresh美国
2019/10/09 全球购物
项目经理任命书内容
2014/06/06 职场文书
党员教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
2016年小学“我们的节日·中秋节”活动总结
2016/04/05 职场文书
MySQL安装后默认自带数据库的作用详解
2021/04/27 MySQL
DE1103使用报告
2022/04/05 无线电