yii项目做负载均衡时请注意验证码session共享问题
2014-12-27 18:46
711 查看
众所周知,做负载均衡的时候,必须解决两个棘手的问题,一是session会话共享问题,二是上传文件同步问题,今天给大家分享一个我遇到过的问题,yii项目登录功能验证码无法同步的解决办法。
本文测试环境:
负载均衡机一台(nginx,做分发用)
A服务器(程序所在机器)
B服务器(程序所在机器)
memcached服务器一台(暂称为s1吧)
关于负载均衡的session会话同步,我不详说,网上一搜一大片,无非就是以下三种:
利用数据库同步session
利用cookie同步session
利用memcache同步session
今天我所说的是第三种,利用memcache同步session,打开A、B服务器的php.ini设置如下:
下面我们进行登录,发现一直提示验证码不正确,尽管输入了无数次也不对:
然后我输出一下session信息,看了看,发现yii的验证码类在存放验证码session的时候,如下:
发现每次刷新页面后,这个session的key都不一样,不一样的地方就在"1d220968"这里,然后我就打开了yii的源文件一看究竟,位置如下:
\framework\web\widgets\captcha\CCaptchaAction.php
第219行的getSessionKey方法,索性我直接去掉了里面的Yii::app()->getId()的拼接,正是上面所说的1d220968部分
再刷新查看session的值,已经没有了1d220968:
Array
(
[Yii.CCaptchaAction.admin/default.captcha] => nime
[Yii.CCaptchaAction.admin/default.captchacount] => 2
)
然后就登录成功,实现了session的同步,也实现了yii验证码session的同步!就此完毕!
众所周知,做负载均衡的时候,必须解决两个棘手的问题,一是session会话共享问题,二是上传文件同步问题,今天给大家分享一个我遇到过的问题,yii项目登录功能验证码无法同步的解决办法。
本文测试环境:
负载均衡机一台(nginx,做分发用)
A服务器(程序所在机器)
B服务器(程序所在机器)
memcached服务器一台(暂称为s1吧)
关于负载均衡的session会话同步,我不详说,网上一搜一大片,无非就是以下三种:
利用数据库同步session
利用cookie同步session
利用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
下面我们进行登录,发现一直提示验证码不正确,尽管输入了无数次也不对:
然后我输出一下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的同步!就此完毕!
相关文章推荐
- yii项目做负载均衡时请注意验证码session共享问题
- tomcat-redis-session-manager实现负载均衡session共享问题
- 负载均衡时,在State_Server模式中的Session共享问题(不讨论负载均衡的问题)
- nginx做负载均衡造成的session共享问题
- tomcat+nginx+redis实现均衡负载、session共享---项目默认路径找不到
- 使用nginx做负载均衡造成的session共享问题
- Nginx+Redis+Tomcat实现负载均衡项目session共享
- apache+tomcat+memcached实现负载均衡,session共享(摘抄+整合)
- Nginx在windows下配合IIS搭建负载均衡多站点共享Session
- nginx tomcat7 memcache设置服务器负载均衡,session共享
- 某项目中“Session failed”问题的分析解决---Alteon交换机负载均衡策略引发的会话失败问题
- windows使用nginx+memcached实现负载均衡和session或者缓存共享
- windows 下Apache和tomcat安装整合全过程 负载均衡session共享
- 关于同一tomcat服务器下2个不同的web项目如何共享session的问题
- 详解之:linux下tomcat、nginx的负载均衡及memcached对session共享的实现配置详细总结
- Nginx在windows下配合IIS搭建负载均衡多站点共享Session
- 某项目中“Session failed”问题的分析解决---Alteon交换机负载均衡策略引发的会话失败问题
- nginx 负载均衡 多站点共享Session
- Centos下Nginx+Apache+Mysql+Memcache实现多负载均衡与Session共享
- nginx 负载均衡 多站点共享Session