yii項目作負載均衡時請注意驗證碼session共享問題

衆所周知,作負載均衡的時候,必須解決兩個棘手的問題,一是session會話共享問題,二是上傳文件同步問題,今天給你們分享一個我遇到過的問題,yii項目登陸功能驗證碼沒法同步的解決辦法。php

本文測試環境:
nginx

  • 負載均衡機一臺(nginx,作分發用)web

  • A服務器(程序所在機器)算法

  • B服務器(程序所在機器)shell

  • memcached服務器一臺(暫稱爲s1吧)數據庫

關於負載均衡的session會話同步,我不詳說,網上一搜一大片,無非就是如下三種:服務器

  1. 利用數據庫同步sessioncookie

  2. 利用cookie同步sessionsession

  3. 利用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的同步!就此完畢!

相關文章
相關標籤/搜索