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 相关文章推荐
js 深拷贝函数
Dec 04 Javascript
javascript下高性能字符串连接StringBuffer类
Aug 16 Javascript
JS 跳转页面延迟2种方法
Mar 29 Javascript
实现51Map地图接口(示例代码)
Nov 22 Javascript
表单提交前触发函数返回true表单才会提交
Mar 11 Javascript
Javascript正则控制文本框只能输入整数或浮点数
Sep 02 Javascript
移动端横屏的JS代码(beta)
May 16 Javascript
判断是否存在子节点的实现代码
May 18 Javascript
jQuery实现Select左右复制移动内容
Aug 05 Javascript
webpack项目轻松混用css module的方法
Jun 12 Javascript
layDate日期控件使用方法详解
Nov 15 Javascript
微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现
Jul 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
php 函数使用方法与函数定义方法
2010/05/09 PHP
php入门学习知识点二 PHP简单的分页过程与原理
2011/07/14 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
使javascript也能包含文件
2006/10/26 Javascript
用javascript动态调整iframe高度的方法
2007/03/06 Javascript
JavaScript 字符串连接性能优化
2008/12/20 Javascript
js解析与序列化json数据(一)json.stringify()的基本用法
2013/02/01 Javascript
jQuery中$this和$(this)的区别介绍(一看就懂)
2015/07/06 Javascript
JavaScript实现获得所有兄弟节点的方法
2015/07/23 Javascript
jQuery实现页面顶部下拉广告
2016/12/30 Javascript
写给小白看的JavaScript异步
2017/11/29 Javascript
利用Javascript获取选择文本所在的句子详解
2017/12/03 Javascript
微信小程序实现红包雨功能
2018/07/11 Javascript
Vue实现开心消消乐游戏算法
2019/10/22 Javascript
vue实例的选项总结
2020/06/09 Javascript
vue cli 3.0通用打包配置代码,不分一二级目录
2020/09/02 Javascript
JavaScript canvas实现跟随鼠标移动小球
2021/02/09 Javascript
python使用fileinput模块实现逐行读取文件的方法
2015/04/29 Python
Python抓取框架 Scrapy的架构
2016/08/12 Python
关于Python中Inf与Nan的判断问题详解
2017/02/08 Python
Python subprocess模块常见用法分析
2018/06/12 Python
选择Python写网络爬虫的优势和理由
2019/07/07 Python
python移位运算的实现
2019/07/15 Python
python retrying模块的使用方法详解
2019/09/25 Python
python如何提取英语pdf内容并翻译
2020/03/03 Python
python导入库的具体方法
2020/06/18 Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
2021/01/23 Python
CSS3之边框多颜色Border-color属性使用示例
2013/10/11 HTML / CSS
SneakerStudio英国:最佳运动鞋商店
2019/05/22 全球购物
POS解决方案:MUNBYN(热敏打印机、条形码扫描仪)
2020/06/09 全球购物
风之谷观后感
2015/06/11 职场文书
财务会计个人原因辞职信
2019/06/21 职场文书
动作冒险《Hell Is Us》将采用虚幻5 消灭怪物探索王国
2022/04/13 其他游戏
python使用pycharm安装pyqt5以及相关配置
2022/04/22 Python
python playwrigh框架入门安装使用
2022/07/23 Python
面试官问我Mysql的存储引擎了解多少
2022/08/05 MySQL