dmz社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7493|回复: 101

[功能实现] php基于redis的处理session的方法

  [复制链接]
  • TA的每日心情

    2024-11-19 20:46
  • 签到天数: 244 天

    [LV.8]以坛为家I

    4434

    主题

    1459

    帖子

    1万

    积分

    会|员

    Rank: 9Rank: 9Rank: 9

    积分
    10734
    发表于 2018-12-26 23:22:26 | 显示全部楼层 |阅读模式

    本站资源全部免费,回复即可查看下载地址!

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    一个基于redis的处理session的方法,如下。
    [PHP] 纯文本查看 复制代码
    <?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函数。
    回复

    使用道具 举报

    该用户从未签到

    18

    主题

    7942

    帖子

    960

    积分

    荣誉会员

    积分
    960

    发表于 2018-12-28 08:42:49 | 显示全部楼层
    小手一抖,钱钱到手!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    40

    主题

    7912

    帖子

    1004

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    1004

    发表于 2018-12-30 22:16:20 | 显示全部楼层
    不错不错,楼主您辛苦了。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    23

    主题

    7814

    帖子

    1023

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    1023

    发表于 2018-12-30 22:50:34 | 显示全部楼层
    我是来刷分的,嘿嘿
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20

    主题

    7880

    帖子

    986

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    986

    发表于 2019-1-1 08:33:37 | 显示全部楼层
    过来看看的
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    23

    主题

    8155

    帖子

    1052

    积分

    荣誉会员

    积分
    1052

    发表于 2019-1-2 08:43:27 | 显示全部楼层
    谢谢楼主,共同发展
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20

    主题

    7854

    帖子

    996

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    996

    发表于 2019-1-5 11:43:56 | 显示全部楼层
    没看完~~~~~~ 先顶,好同志
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    3452

    帖子

    10

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    10

    发表于 2019-1-6 19:30:25 | 显示全部楼层
    没看完~~~~~~ 先顶,好同志
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    28

    主题

    7920

    帖子

    1033

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    1033

    发表于 2019-1-7 13:58:43 | 显示全部楼层
    正需要,支持楼主大人了!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    42

    主题

    7760

    帖子

    928

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    928

    发表于 2019-1-7 18:57:25 | 显示全部楼层
    支持一下:lol
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|小黑屋|本站代理|dmz社区

    GMT+8, 2024-12-23 23:58 , Processed in 0.612368 second(s), 42 queries .

    Powered by Discuz! X3.4 Licensed

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表