PHP自定义SESSION保存到REDIS中

工作中经常遇到,多台机器登录的问题, 这里的解决方案就是保存到memcache,或者redis中。

<?php
class Session implements SessionHandlerInterface
{
    private static $lifetime = null;//session周期
    private static $domain = null;//当前域名
    
    private static function init()
    {
        self::$lifetime = ini_get('session.gc_maxlifetime') ? ini_get('session.gc_maxlifetime') : 1800;
        self::$domain = 'xxxx';
    }
    
    public static function start()
    {
        self::init();
        //多主机共享保存 SESSION ID 的 COOKIE,
        //        ini_set('session.cookie_domain', self::$_domain);
        //将 session.save_handler 设置为 redis,而不是默认的 files
        session_module_name('redis');
        $obj = new Com_Session();
        session_set_save_handler(
            array(&$obj, 'open'),
            array(&$obj, 'close'),
            array(&$obj, 'read'),
            array(&$obj, 'write'),
            array(&$obj, 'destroy'),
            array(&$obj, 'gc'));
        // 下面这行代码可以防止使用对象作为会话保存管理器时可能引发的非预期行为
        register_shutdown_function('session_write_close');
        session_start();
    }
    
    public function open($savePath, $sessionName)
    {
        return true;
    }
    
    public function close()
    {
        return true;
    }
    
    public function read($sessionId)
    {
        if (!$sessionId) return '';
        //重redis获取值
        $res = Libs_Cache_Redis::get($sessionId);
        return $res ? unserialize($res) : '';
    }
    
    public function write($sessionId, $data)
    {
        if (!$sessionId) return '';
         //自定义的设置redis方法
        $res = Libs_Cache_Redis::set($sessionId, serialize($data), self::$lifetime);
        return $res ? $res : '';
    }
    
    public function destroy($sessionId)
    {
        if (!$sessionId) return '';
        //这里是自定义Redis类的删除
        $res = Libs_Cache_Redis::delete($sessionId);
        return $res ? $res : '';
    }
    
    public function gc($maxlifetime)
    {
        return true;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Nosql概述 在介绍Redis之前,首先先要介绍Nosql的概念。 互联网架构发展 在90年代的时候,计算机访问...
    COKIDCC阅读 703评论 0 1
  • NOSQL类型简介键值对:会使用到一个哈希表,表中有一个特定的键和一个指针指向特定的数据,如redis,volde...
    MicoCube阅读 4,099评论 2 27
  • 主要内容 redis 简介 为什么要用 redis /为什么要用缓存 为什么要用 redis 而不用 map/gu...
    java成功之路阅读 607评论 0 4
  • 包含的重点内容:JAVA基础JVM 知识开源框架知识操作系统多线程TCP 与 HTTP架构设计与分布式算法数据库知...
    消失er阅读 4,422评论 1 10
  • 给同事的个案: 中心力量是红龙 支持力量是白镜子 指引力量是红蛇 高我力量是黄太阳 挑战力量是蓝猴 哈哈,不得不说...
    ce0258a0b6d2阅读 179评论 0 0