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

Yii 1.1.x下使用Redis做共享session的问题

2016-11-25 10:30 316 查看

问题说明

我在使用nginx + apache(php module)搭建应用集群,并使用redis 做共享session时会出现:已经登陆的用户在某个节点可以取到session信息但页面仍显示未登陆的情况。调试代码后发现:Yii 1.1.x会基于应用路径去生成session key的前缀,而我的环境是一个应用节点部署在windows下,另一个是部署在ubuntu下,导致生成的session key会不同,从而只有一个节点可以取到登陆信息,其他节点则认为其未登陆

总结

Yii 使用基于应用路径去生成session key的前缀是为了避免同一网站下不同Yii应用产生session覆盖

在Yii应用集群环境中,应用要统一部署到相同路径下或者负载均衡软件使用客户端IP绑定策略(如使用nginx的ip_hash指令)

部署说明

192.168.171.111(windows 10)
nginx 1.10.2
apache 2.2(php5 module)
192.168.171.129(ubuntu 14.04)
apache 2.4(php5 module)
Redis 2.28


nginx 配置信息

upstream web-server {
#ip_hash;
server 192.168.171.111:8801;
server 192.168.171.129:8801;
}


代码说明

CWebUser.php

public function getStateKeyPrefix()
{
if($this->_keyPrefix!==null)
return $this->_keyPrefix;
else
return $this->_keyPrefix=md5('Yii.'.get_class($this).'.'.Yii::app()->getId());
//return $this->_keyPrefix=md5('Yii.'.get_class($this));
}


CApplication.php

public function getId()
{
if($this->_id!==null)
return $this->_id;
else
return $this->_id=sprintf('%x',crc32($this->getBasePath().$this->name));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  yii redis nginx session php