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 相关文章推荐
jQuery each()小议
Mar 18 Javascript
浅谈javascript中的作用域
Apr 07 Javascript
JavaScript异步加载浅析
Dec 28 Javascript
AngularJS控制器之间的数据共享及通信详解
Aug 01 Javascript
Javascript json object 与string 相互转换的简单实现
Sep 27 Javascript
js 模仿锚点定位的实现方法
Nov 19 Javascript
Javascript中类式继承和原型式继承的实现方法和区别之处
Apr 25 Javascript
layer弹出子iframe层父子页面传值的实现方法
Nov 22 Javascript
微信小程序bindinput与bindsubmit的区别实例分析
Apr 17 Javascript
vue实现Excel文件的上传与下载功能的两种方式
Jun 28 Javascript
v-slot和slot、slot-scope之间相互替换实例
Sep 04 Javascript
Vue实现圆环进度条的示例
Feb 06 Vue.js
使用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
smarty自定义函数htmlcheckboxes用法实例
2015/01/22 PHP
PHP PDOStatement::debugDumpParams讲解
2019/01/30 PHP
PHP实现文件上传操作和封装
2020/03/04 PHP
解读JavaScript中 For, While与递归的用法
2013/05/07 Javascript
js控制的遮罩层实例介绍
2013/05/29 Javascript
jquery ajax post提交数据乱码
2013/11/05 Javascript
alert和confirm功能介绍
2014/05/21 Javascript
jQuery前端分页示例分享
2015/02/10 Javascript
JS实现当前页居中分页效果的方法
2015/06/18 Javascript
JS控制按钮10秒钟后可用的方法
2015/12/22 Javascript
微信小程序的动画效果详解
2017/01/18 Javascript
详解Angular 4.x 动态创建组件
2017/04/25 Javascript
Angular中封装fancyBox(图片预览)遇到问题小结
2017/09/01 Javascript
axios 处理 302 状态码的解决方法
2018/04/10 Javascript
[05:35]DOTA2英雄梦之声_第13期_拉比克
2014/06/21 DOTA
[02:03]DOTA2亚洲邀请赛 HGT战队出场宣传片
2015/02/07 DOTA
Python2.x中文乱码问题解决方法
2015/06/02 Python
Python 2.x如何设置命令执行的超时时间实例
2017/10/19 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
2021/01/07 Python
Clarisonic美国官网:科莱丽声波洁面仪
2017/10/12 全球购物
美国汽车轮胎和轮毂销售网站:Tire Rack
2018/01/11 全球购物
意大利值得信赖的在线超级药房:PillolaStore
2020/02/05 全球购物
EJB2和EJB3在架构上的不同点
2014/09/29 面试题
EJB的基本架构
2016/09/22 面试题
高校学生干部的自我评价分享
2013/11/04 职场文书
考博专家推荐信模板
2013/12/02 职场文书
小学科学教学反思
2014/01/26 职场文书
揠苗助长教学反思
2014/02/04 职场文书
护理专科自荐书范文
2014/02/18 职场文书
好人好事演讲稿
2014/09/01 职场文书
诉讼授权委托书
2014/10/15 职场文书
泰坦尼克号观后感
2015/06/04 职场文书
工作服管理制度范本
2015/08/06 职场文书
nginx刷新页面出现404解决方案(亲测有效)
2022/03/18 Servers
《辉夜大小姐想让我告白》第三季正式预告
2022/03/20 日漫