yii项目做负载均衡时请注意验证码session共享问题

众所周知,做负载均衡的时候,必须解决两个棘手的问题,一是session会话共享问题,二是上传文件同步问题,今天给大家分享一个我遇到过的问题,yii项目登录功能验证码无法同步的解决办法。

本文测试环境:

  • 负载均衡机一台(nginx,做分发用)

  • A服务器(程序所在机器)

  • B服务器(程序所在机器)

  • memcached服务器一台(暂称为s1吧)

关于负载均衡的session会话同步,我不详说,网上一搜一大片,无非就是以下三种:

  1. 利用数据库同步session

  2. 利用cookie同步session

  3. 利用memcache同步session

今天我所说的是第三种,利用memcache同步session,打开A、B服务器的php.ini设置如下:

#设置php.ini存储session的方式为memcache
session.save_handler = memcache  // 设置session的储存方式为memcache
memcache.hash_strategy = "consistent" //设置memcache的hash算法
session.save_path = "tcp://192.168.1.101:11211" //设置session储存的位置,101为s1服务器的IP


下面我们进行登录,发现一直提示验证码不正确,尽管输入了无数次也不对:

    103952_BIVF_1415860.jpg

然后我输出一下session信息,看了看,发现yii的验证码类在存放验证码session的时候,如下:

Array
(
    [Yii.CCaptchaAction.1d220968.admin/default.captcha] => nime
    [Yii.CCaptchaAction.1d220968.admin/default.captchacount] => 2
)

发现每次刷新页面后,这个session的key都不一样,不一样的地方就在"1d220968"这里,然后我就打开了yii的源文件一看究竟,位置如下:

\framework\web\widgets\captcha\CCaptchaAction.php

第219行的getSessionKey方法,索性我直接去掉了里面的Yii::app()->getId()的拼接,正是上面所说的1d220968部分

protected function getSessionKey()
{
    //原来的:
    //return self::SESSION_VAR_PREFIX . Yii::app()->getId() . '.' . $this->getController()->getUniqueId() . '.' . $this->getId();
    //修改后:
    return self::SESSION_VAR_PREFIX . $this->getController()->getUniqueId() . '.' . $this->getId();
}

再刷新查看session的值,已经没有了1d220968:

Array
(
    [Yii.CCaptchaAction.admin/default.captcha] => nime
    [Yii.CCaptchaAction.admin/default.captchacount] => 2
)

然后就登录成功,实现了session的同步,也实现了yii验证码session的同步!就此完毕!

转载于:https://my.oschina.net/ruiorz/blog/280940

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值