這個月我們新開發了一個項目,由于使用到了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();*/
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答