2008-11-01 48 views
9

在工作中,我們幾乎在Java和Perl中做了所有事情,但我想用PHP和會話來構建一個功能。一些窺視者認爲嘗試在我們的系統上執行PHP會話並不是一個好主意,因爲它會分發到許多服務器上。具體的問題是什麼?PHP會話難以跨分佈式系統進行擴展嗎?

回答

4

對於您的具體問題,問題的答案在於,默認情況下,PHP會將其會話存儲在文件系統的文件中。對於單個網絡服務器提供請求,這不是問題,因爲您的會話數據將始終可用。但是如果您有兩個負載平衡的Web服務器爲請求提供服務呢?

想象一下,用請求創建第一個網絡服務器,該請求會在其文件系統上創建會話文件。然後,您的下一個請求會遇到第二個Web服務器。第二個Web服務器當然不會看到會話文件。對於用戶,您可能會登錄到一個網站,然後突然被註銷。

這不是PHP特有的問題,而且很常見。解決方案是將會話數據存儲在某個公共區域。最常見的方法是將會話數據存儲在所有Web服務器可訪問的數據庫中,或者像memcached一樣的共享內存緩存服務器。

+0

正如@azkotoki在下面提到的,像NAS備份的NFS掛載這樣的共享分區也可以。關於這一點的好處是它不涉及代碼更改。只需將本地會話目錄符號鏈接到NFS即可。 – gerard 2010-05-05 15:58:12

4

跨多個服務器(也稱爲會話羣集)持續會話是擴展Web應用程序的常見問題,並不特定於PHP。 PHP確實提供了幾種解決方案,例如Zend Platform(商業應用服務器)和Msession(擴展)。

10

您也可以使用自定義會話保存處理程序:

http://www.php.net/manual/en/function.session-set-save-handler.php

我還沒有過嘗試過,但有了它你定義自己的保存/讀取功能,這樣你就可以實現數據庫或一個共享的nfs後端,無需安裝任何擴展。

此外,@Eran Galperin建議的Msession作爲我之前提到的替代品看起來非常有趣。

+0

這是一個偉大的答案,我將使用這種方法。謝謝! – woody121 2014-04-23 06:45:51

0

很模糊的問題,但我會說這個問題比答案中提到的要大。當然,您可以重寫如何加載和保存cookie,但也有成本。例如,您將不得不考慮以下方案/問題:

  • 如果您將cookie放在另一個主機上,這將如何影響cookie的速度?這顯然取決於你做了多少次寫/讀。
  • 你這樣做是爲了提高速度還是進行故障轉移?答案肯定會導致不同的解決方案:
    • 如果您正在進行故障轉移,如果您的網絡服務器無法訪問會話存儲,因爲網絡鏈接斷開,您將如何處理?如果你的會話存儲失敗怎麼辦?您必須使用某種主 - 主複製來解決此問題,可能需要在與Web服務器相同的計算機上運行該分佈式會話存儲以獲得額外的高可用性(如果所有會話都可以裝入內存)。看看Riak或類似的主 - 主複製。
    • 如果您只是爲了提高速度,我會使用apache,nginx或(最快)haproxy來簡單地根據客戶端IP地址進行負載均衡。這樣您就不必費心設置分佈式會話存儲。當然,如果你的一個PHP實例出現故障,你的用戶將丟失他們的cookies,但也許這不是問題。隨你便。