2011-04-28 44 views
2

我有2臺服務器可用於故障轉移。數據庫作爲Master-Master被複制(MySQL),因此每個服務器都運行全棧的副本。當我在一臺服務器上時,我看到會話表得到更新,檢查請求後,我看到相同的PHPSESSID正在發送。但是,當我更改URL或故障轉移到輔助機器時,我的會話被終止,我必須重新登錄。PHP複製數據庫會話故障轉移

在輔助節點上發送相同的PHPSESSID值,但會話無法識別。 Apache/PHP是否將會話鏈接到該特定框?如果是這樣,我如何讓他們識別已經在數據庫中的會話?

回答

1

注:從「編輯」移動到答案,標記爲回答

居然找到了解決辦法。 '問題'是用於保護PHP安裝的Suhosin補丁。 Suhosin支持基於crypt密鑰和應用程序的DocRoot對會話數據進行加密的可配置選項,因爲故障轉移服務器具有不同的DocRoot,因此不會讀取加密數據。

我編輯了suhosin.ini來添加一個共享的加密密鑰,並關閉了DocRoot加密選項,並按預期方式共享這些會話。

解決方案通過:http://rommelsantor.com/clog/2011/02/06/php-shared-session-encoding-solution/

0

如果您使用的是$_SESSION那麼這個綁定到該服務器。您應該使用cookie跟蹤會話標識符,然後將其與數據庫中的會話進行備份。

+0

@drowe:回顧這個PHP函數:http://php.net/manual/de/function.session-set-save-handler.php – SteAp 2011-04-28 21:38:07

+0

我使用$ _SESSION,和我有PHPSESSID中的cookie值與數據庫中的ID匹配。但是,當PHP嘗試使用會話數據時,它會發生變化。它的哪部分與特定服務器綁定?我可以覆蓋它,這樣一臺服務器可以識別來自另一臺的會話數據嗎? – drowe 2011-04-28 21:38:26

+0

您應該瞭解會話的工作方式。 PHP中的會話通過使用cookie向客戶端提供令牌,然後將數據存儲在$ _SESSION本地磁盤上。當客戶端再次連接時,它會將會話令牌與磁盤上存儲的數據重新組合。 – JohnD 2011-04-28 21:41:17