PHP多台伺服器跨域SESSION共享

2022-04-03 17:08:46 字數 1773 閱讀 3267

**業務規模和訪問量的逐步發展,原本由單台伺服器、單個網域名稱的迷你**架構已經無法滿足發展需要。

(如:dns輪詢、radware、f5、lvs等)讓多個頻道共享一組伺服器。

ok,頭腦中我們已經構思了這樣的解決方案,不過進入深入開發後新的技術問題又隨之而來:

我們把**程式分布部署到多台伺服器上,而且獨立為幾個二級網域名稱,由於session受實現原理的侷限(php中session預設以檔案的形

式儲存在本地伺服器的硬碟),使得我們的**使用者不得不經常在幾個頻道間來回輸入使用者名稱、密碼登入,導致使用者體驗大打折扣;另外,原本程式可以直接從使用者

session變數中讀取的資料(如:暱稱、積分、登入時間等),因為無法跨伺服器同步更新session變數,迫使開發人員必須實時讀寫資料庫,從而增

加了資料庫的負擔。

1. 基於nfs的session共享

nfs是net filesystem的簡稱,最早由sun公司為解決unix網路主機間的目錄共享而研發。

這個方案實現最為簡單,無需做過多的二次開發,僅需將共享目錄伺服器mount到各頻道伺服器的本地session目錄即可,缺點是nfs依託

於復 雜的安全機制和檔案系統,因此併發效率不高,尤其對於session這類高併發讀寫的小檔案,

會由於共享目錄伺服器的io-wait過高,最終拖累前端web應用程式的執行效率。

2. 基於資料庫的session共享

首選當然是大名鼎鼎的mysql資料庫,並且建議使用記憶體表heap,提高session操作的讀寫效率。這個方案的實用性比較強,相信大家普

遍在使用,它的缺點在於session的併發讀寫能力取決於mysql資料庫的效能,同時需要自己實現session淘汰邏輯,以便定時從資料表中更新、刪除

session記錄,當併發過高時容易出現表鎖,雖然我們可以選擇行級鎖的表引擎,但不得不否認使用資料庫儲存session還是有些殺雞用牛刀的架勢。

3. 基於cookie的session共享

這個方案我們可能比較陌生,但它在大型**中還是比較普遍被使用。原理是將全站使用者的session資訊加密、序列化後以cookie的方式,

統一種植在根網域名稱下(如:.host.com),利用瀏覽器訪問該根網域名稱下的所有二級網域名稱站點時,會傳遞與之網域名稱對應的所有cookie內容的特性,從而實現

使用者的cookie化session 在多服務間的共享訪問。

這個方案的優點無需額外的伺服器資源;缺點是由於受http協議頭信心長度的限制,僅能夠儲存小部分的使用者資訊,同時cookie化的

session內容需要進行安全加解密(如:採用des、rsa等進行明文加解密;再由md5、sha-1等演算法進行防偽認證),另外它也會占用一定的帶

寬資源,因為瀏覽器會在請求當前網域名稱下任何資源時將本地cookie附加在http頭中傳遞到伺服器。

4. 基於memcache的session共享

memcache由於是一款基於libevent多路非同步i/o技術的記憶體共享系統,簡單的key +

value資料儲存模式使得**邏輯小巧高效,因此在併發處理能力上佔據了絕對優勢,目前本人所經歷的專案達到2000/秒

平均查詢,並且伺服器cpu消耗依然不到10%。

另外值得一提的是memcache的記憶體hash表所特有的expires資料過期淘汰機制,正好和session的過期機制不謀而合,降低了

過期session資料刪除的**複雜度,對比「基於資料庫的儲存方案」,僅這塊邏輯就給資料表產生巨大的查詢壓力。

基於memcache 的儲存是這幾個方案中推薦選用的!

其它方案依然有其使用的場合,具體選用哪套需要開發人員的根據當前的伺服器資源、**併發壓力等綜合評估。

統計多台伺服器日誌

q 當某應用部署了多台伺服器時,一次請求可能被路由到其中任意一台做處理,如何通過日誌查詢一次請求的處理結果?a 每台伺服器都去找找總能找到吧。ok,思路是對的,但是人工去操作好麻煩,寫個shell指令碼跑一下。1 建立乙個應用伺服器ip列表檔案prodiplist,如下 10.174.88.199 ...

多台伺服器session cookie之間的關係

1 同域跨子域使用一套session和cookie的辦法,ini set session.cookie domain 當前域 可以在php.ini裡修改配置 session.cookie domain 2 同域不同埠 在區域網內使用ip加埠的訪問方式搭了兩個相同程式的站,結果發現使用者在乙個站下登入...

統計多台伺服器日誌

q 當某應用部署了多台伺服器時,一次請求可能被路由到其中任意一台做處理,如何通過日誌查詢一次請求的處理結果?a 每台伺服器都去找找總能找到吧。ok,思路是對的,但是人工去操作好麻煩,寫個shell指令碼跑一下。1 建立乙個應用伺服器ip列表檔案prodiplist,如下 10.174.88.199 ...