衆所周知,作負載均衡的時候,必須解決兩個棘手的問題,一是session會話共享問題,二是上傳文件同步問題,今天給你們分享一個我遇到過的問題,yii項目登陸功能驗證碼沒法同步的解決辦法。php
本文測試環境:
nginx
負載均衡機一臺(nginx,作分發用)web
A服務器(程序所在機器)算法
B服務器(程序所在機器)shell
memcached服務器一臺(暫稱爲s1吧)數據庫
關於負載均衡的session會話同步,我不詳說,網上一搜一大片,無非就是如下三種:服務器
利用數據庫同步sessioncookie
利用cookie同步sessionsession
利用memcache同步sessionapp
今天我所說的是第三種,利用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的同步!就此完畢!