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异步编程的4种方法让你写出更出色的程序
Jan 17 Javascript
关于scrollLeft,scrollTop的浏览器兼容性测试
Mar 19 Javascript
js 剪切板的用法(clipboardData.setData)与js match函数介绍
Nov 19 Javascript
innerHTML中标签可以换行的方法汇总
Aug 14 Javascript
js简单实现Select互换数据的方法
Aug 17 Javascript
javascript自定义滚动条实现代码
Apr 20 Javascript
Bootstrapvalidator校验、校验清除重置的实现代码(推荐)
Sep 28 Javascript
js字符串操作总结(必看篇)
Nov 22 Javascript
详解ES6通过WeakMap解决内存泄漏问题
Mar 09 Javascript
JavaScript深拷贝和浅拷贝概念与用法实例分析
Jun 07 Javascript
简述JS浏览器的三种弹窗
Jul 15 Javascript
浅谈vue生命周期共有几个阶段?分别是什么?
Aug 07 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制作简单的内容采集器的原理分析
2008/10/01 PHP
php is_file()和is_dir()用于遍历目录时用法注意事项
2010/03/02 PHP
PHP加Nginx实现动态裁剪图片方案
2014/03/10 PHP
php实现在服务器上创建目录的方法
2015/03/16 PHP
php 变量引用与变量销毁机制详细介绍
2016/12/05 PHP
prototype.js的Ajax对象
2006/09/23 Javascript
JavaScript 序列化对象实现代码
2009/12/18 Javascript
JavaScript CSS修改学习第一章 查找位置
2010/02/19 Javascript
JavaScript 原型继承
2011/12/26 Javascript
JS添加删除一组文本框并对输入信息加以验证判断其正确性
2013/04/11 Javascript
Jquery注册事件实现方法
2015/05/18 Javascript
原生js实现可拖动的登录框效果
2017/01/21 Javascript
谈谈JavaScript数组常用方法总结
2017/01/24 Javascript
JavaScript原生实现观察者模式的示例
2017/12/15 Javascript
浅谈Vue render函数在ElementUi中的应用
2018/09/06 Javascript
详解JavaScript 作用域
2020/07/14 Javascript
JQuery Ajax如何实现注册检测用户名
2020/09/25 jQuery
antd中table展开行默认展示,且不需要前边的加号操作
2020/11/02 Javascript
用python分割TXT文件成4K的TXT文件
2009/05/23 Python
Linux系统上Nginx+Python的web.py与Django框架环境
2015/12/25 Python
python3使用PyMysql连接mysql数据库实例
2017/02/07 Python
tensorflow识别自己手写数字
2018/03/14 Python
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
Python 中字符串拼接的多种方法
2018/07/30 Python
Selenium chrome配置代理Python版的方法
2018/11/29 Python
python 创建一维的0向量实例
2019/12/02 Python
计算pytorch标准化(Normalize)所需要数据集的均值和方差实例
2020/01/15 Python
通过Python实现Payload分离免杀过程详解
2020/07/13 Python
Python读取图像并显示灰度图的实现
2020/12/01 Python
css3实现动画的三种方式
2020/08/24 HTML / CSS
迪卡侬比利时官网:Decathlon比利时
2019/12/28 全球购物
抽象类和接口的区别
2012/09/19 面试题
求职信范文英文版
2014/01/05 职场文书
会计试用期自我评价怎么写
2014/09/18 职场文书
阿里云 Windows server 2019 配置FTP
2022/04/28 Servers
python单向链表实例详解
2022/05/25 Python