您的位置:首页 > 数据库 > Redis

用redis实现跨服务器session

2013-12-10 15:13 387 查看
http://blog.chinaunix.net/uid-11121450-id-3284875.html

用redis实现跨服务器session 2012-07-23
23:00:51

分类: 系统运维

这个月我们新开发了一个项目,由于使用到了4台机器做web,使用dns做负载均衡,




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

点击(此处)折叠或打开

<?php

/*

*用redis实现跨服务器session

*注意需要安装phpredis模块

*

*作者:yifangyou

*日期:2012-07-23 22:55:00

**/

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);

}

}

?>

使用方法:

点击(此处)折叠或打开

<?php

error_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管理



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: