首页 > 数据库 > Redis > 正文

用redis实现跨服务器session

2020-03-22 17:49:26
字体:
来源:转载
供稿:网友
  • 这个月我们新开发了一个项目,由于使用到了4台机器做web,使用dns做负载均衡,


    上面图上用户通过DNS的调度(一个域名对应多个ip)分别访问到VM2-VM5上,四台机器都访问VM1上的redis,两个redis值主从结构.
    因此需要使用跨服务器的session保存用户登录状态,于是我写了一个跨站的session共享的类

    <?php    /*     *用redis实现跨服务器session     *注意需要安装phpredis模块     *     *作者:yifangyouwww.it165.net     *日期:2012-07-23 22:55:00    **/html' target='_blank'>class RedisSession{    var $expire=86400;//过期时间    var $sso_session;//session id    var $session_folder;//session目录    var $cookie_name;//cookie的名字    var $redis;//redis连接    var $cache;//缓存session    var $expireAt;//过期时间    /*     *初始化     *参数     *$redis:php_redis的类实例     *$cookie_name:cookie的名字     *$session_id_prefix:sesion id的前缀    **/    function RedisSession($redis,$expire=86400,$cookie_name="sso_session",$session_id_prefix=""){        $this->redis=$redis;        $this->cookie_name=$cookie_name;        $this->session_folder="sso_session:";    //若是cookie已经存在则以它为session的id        if(isset($_COOKIE[$this->cookie_name])){             $this->sso_session=$_COOKIE[$this->cookie_name];        }else{            $this->expire=$expire;            $this->expireAt=time()+$this->expire;         //在IE6下的iframe无法获取到cookie,于是我使用了get方式传递了cookie的名字            if(isset($_GET[$this->cookie_name])){                    $this->sso_session=$_GET[$this->cookie_name];            }else{                    $this->sso_session=$this->session_folder.$session_prefix.md5(uniqid(rand(), true));                }            setcookie($this->cookie_name,$this->sso_session,$this->expireAt,"/");        }    }        /*     *设置过期时间     *参数    **/    function expire($expire=86400){            $this->expire=$expire;            $this->expireAt=time()+$this->expire;            //设置session过期时间            setcookie($this->cookie_name,$this->sso_session,$this->expireAt,"/",".greatwallwine.com.cn");            $this->redis->expireAt($this->sso_session, $this->expireAt);    }        /*     *设置多个session的值     *参数     *$array:值    **/    function setMutil($array){        $this->redis->hMset($this->sso_session,$array);    }    /*     *设置session的值     *参数     *$key:session的key     *$value:值    **/    function set($key,$value){        $this->redis->hSet($this->sso_session,$key,$value);    }    /*     *设置session的值为对象     *参数     *$key:session的key     *$object:对象    **/    function setObject($key,$object){        $this->redis->hSet($this->sso_session,$key,serialize($object));    }        /*     *获取全部session的key和value     @return: array    **/    function getAll(){        return $this->redis->hGetAll($this->sso_session);    }                /*     *获取一个session的key和value     @return: array    **/    function get($key){        return $this->redis->hGet($this->sso_session,$key);    }      /*     *获取session的值为对象     *参数     *$key:session的key     *$value:cookie的名字    **/    function getObject($key){        return unserialize($this->redis->hGet($this->sso_session,$key));    }    /*     *从缓存中获取一个session的key和value     @return: array    **/    function getFromCache($key){        if(!isset($this->cache)){            $this->cache=$this->getAll();        }        return $this->cache[$key];    }        /*     *删除一个session的key和value     @return: array    **/    function del($key){        return $this->redis->hDel($this->sso_session,$key);    }    /*     *删除所有session的key和value     @return: array    **/    function delAll(){        return $this->redis->delete($this->sso_session);    }}?>

    使用方法:
    <?phperror_reporting(0);$redisHost="192.168.1.2";$redisPort="6379";$redis = new Redis();$redis->connect($redisHost,$redisPort);include_once("inc/RedisSession.php");$redisSession=new RedisSession($redis);/*$redisSession->set("name","sdf4");$redisSession->set("age",1234);$redisSession->set("***","man14");$redisSession->set("name","abc4");$redisSession->setMutil(array("province"=>"guangdong","city"=>"guangzhou"));*/$redisSession->setObject("obj",array("test1"=>array("test2")));$obj=$redisSession->getObject("obj");print_r($obj);die();print_r($redisSession->getAll());//$redisSession->del("name");print_r($redisSession->get("name"));//print_r($redisSession->get("province"));//$redisSession->delAll();//print_r($redisSession->getAll());print_r($redisSession->getFromCache("name"));/*    $redisSession->del("name");    $redisSession->delAll();*/

    比较常用的估计是set,get,setObject,getOject
    我用sso_session:我主要是方便用phpRedisAdmin管理


    PHP编程

    郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

  • 发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表