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

问题说明

我在使用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 1.1.x下使用Redis做共享session的问题)