用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管理
用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管理
相关文章推荐
- redis缓存服务器(Nginx+Tomcat+redis+MySQL实现session会话共享) 推荐
- Nginx+Tomcat+Redis实现应用服务器集群负载均衡和Session共享
- 图文并茂超详细搭建redis缓存服务器(nginx+tomcat+redis+mysql实现session会话共享) 推荐
- [转载]用redis实现跨服务器session
- 用redis实现跨服务器session(转)
- 图文并茂超详细搭建redis缓存服务器(nginx+tomcat+redis+mysql实现session会话共享)
- redis缓存服务器(Nginx+Tomcat+redis+MySQL实现session会话共享
- redis实现跨服务器session共享
- Spring集成redis实现session共享(无视服务器)
- IIS服务器用redis实现session共享
- Windows环境下Nginx+Tomcat+Redis实现应用服务器集群负载均衡和Session共享
- 用redis实现跨服务器存储session
- 用redis实现跨服务器session
- 服务器集群中实现Session共享的解决办法(Redis)
- php多台服务器怎样实现session共享2:写入redis
- redis缓存服务器(nginx+tomcat+redis+mysql实现session会话共享) 推荐
- Node.js Redis Expess 开发环境配置及Session实现服务器间共享实例
- (spring redis第二章)Spring+Redis+Nginx实现不同服务器下的Session共享
- 负载均衡,最理想使用 redis实现session共享
- 用Redis实现Session功能