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 对话框和状态栏使用说明
Oct 25 Javascript
Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器
Feb 24 Javascript
checkbox使用示例
Aug 23 Javascript
node.js中的fs.mkdirSync方法使用说明
Dec 17 Javascript
BootStrap Fileinput的使用教程
Dec 30 Javascript
JS变量及其作用域
Mar 29 Javascript
利用vue + element实现表格分页和前端搜索的方法
Dec 25 Javascript
jQuery仿移动端支付宝键盘的实现代码
Aug 15 jQuery
JavaScript数组去重的方法总结【12种方法,号称史上最全】
Feb 28 Javascript
详解element-ui中form验证杂记
Mar 04 Javascript
详解JavaScript函数callee、call、apply的区别
Mar 08 Javascript
Vue实现购物车实例代码两则
May 30 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的输出:缓存并压缩动态页面
2013/06/11 PHP
Codeigniter整合Tank Auth权限类库详解
2014/06/12 PHP
laravel学习教程之存取器
2016/07/30 PHP
layui数据表格自定义每页条数limit设置
2019/10/26 PHP
php7 错误处理机制修改实例分析
2020/05/25 PHP
ie focus bug 解决方法
2009/09/03 Javascript
Fixie.js 自动填充内容的插件
2012/06/28 Javascript
使用javascript实现页面定时跳转总结篇
2013/09/21 Javascript
wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析
2015/05/06 Javascript
把Node.js程序加入服务实现随机启动
2015/06/25 Javascript
jQuery实现div随意拖动的实例代码(通用代码)
2016/01/28 Javascript
Nodejs爬虫进阶教程之异步并发控制
2016/02/15 NodeJs
javascript类型系统——日期Date对象全面了解
2016/07/13 Javascript
Javascript ES6中数据类型Symbol的使用详解
2017/05/02 Javascript
微信小程序开发之toast提示插件使用示例
2017/06/08 Javascript
Vue2.0利用vue-resource上传文件到七牛的实例代码
2017/07/28 Javascript
jQuery实现鼠标滑过商品小图片上显示对应大图片功能【测试可用】
2018/04/27 jQuery
JQueryDOM之样式操作
2019/03/27 jQuery
微信小程序实现上拉加载功能
2019/11/20 Javascript
React倒计时功能实现代码——解耦通用
2020/09/18 Javascript
python 实现删除文件或文件夹实例详解
2016/12/04 Python
python 第三方库的安装及pip的使用详解
2017/05/11 Python
python实现微信机器人: 登录微信、消息接收、自动回复功能
2019/04/29 Python
python使用time、datetime返回工作日列表实例代码
2019/05/09 Python
详解vscode实现远程linux服务器上Python开发
2020/11/10 Python
matplotlib部件之矩形选区(RectangleSelector)的实现
2021/02/01 Python
Bally澳大利亚官网:瑞士奢侈品牌
2018/11/01 全球购物
小学生学习感言
2014/03/10 职场文书
市场营销专业应届生自荐信
2014/06/19 职场文书
银行奉献演讲稿
2014/09/16 职场文书
无刑事犯罪记录证明
2014/09/18 职场文书
大学生入党积极分子自我评价
2014/09/20 职场文书
同乡会致辞
2015/07/30 职场文书
情侣餐厅的创业计划书范本!
2019/07/26 职场文书
带你彻底理解JavaScript中的原型对象
2021/04/14 Javascript
Python打包exe时各种异常处理方案总结
2021/05/18 Python