PHP多台伺服器跨域SESSION共用

来源:http://www.cnblogs.com/xuzhh/archive/2016/08/17/5781043.html
-Advertisement-
Play Games

網站業務規模和訪問量的逐步發展,原本由單台伺服器、單個功能變數名稱的迷你網站架構已經無法滿足發展需要。 此時我們可能會購買更多伺服器,並且啟用多個二級子功能變數名稱以頻道化的方式,根據業務功能將網站分佈部署在獨立的伺服器上;或通過負載均衡技術 (如:DNS輪詢、Radware、F5、LVS等)讓多個頻道共用一組服務 ...


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

  此時我們可能會購買更多伺服器,並且啟用多個二級子功能變數名稱以頻道化的方式,根據業務功能將網站分佈部署在獨立的伺服器上;或通過負載均衡技術 (如:DNS輪詢、Radware、F5、LVS等)讓多個頻道共用一組伺服器。

 

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

  我們把網站程式分佈部署到多台伺服器上,而且獨立為幾個二級功能變數名稱,由於Session受實現原理的局限(PHP中Session預設以文件的形 式保 存在本地伺服器的硬碟),使得我們的網站用戶不得不經常在幾個頻道間來回輸入用戶名、密碼登入,導致用戶體驗大打折扣;另外,原本程式可以直接從用戶 Session變數中讀取的資料(如:昵稱、積分、登入時間等),因為無法跨伺服器同步更新Session變數,迫使開發人員必須實時讀寫資料庫,從而增 加了資料庫的負擔。

  於是,解決網站跨伺服器之間的Session共用方案需求變得迫切起來,最終催生了多種解決方案,下麵列舉4種較為可行的方案進行對比探討:

  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 的存儲是這幾個方案中推薦選用的!

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 提交給ACM與IEEE的論文中(如CIKM),除了有明確具體字體類型的Type1和TrueType字體外,經常會出現Type3字體。 Type 3 字體是矢量外框字體,很多網站所稱Type 3是點陣字體其實是錯誤的。不同於 Type 1,PostScript Type 3 字體不支援 Hinting ...
  • 一、生成器 通過列表生成式,我們可以直接創建一個列表。但是,受到記憶體限制,列表容量肯定是有限的。而且,創建一個包含100萬個元素的列表,不僅占用很大的存儲空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了。所以,如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈 ...
  • 最近新寫的程式要做beta測試,在做綠色版(免安裝版)時遇到了問題,vs2015做的項目本以為像之前的vs版本一樣把msvcrXXX.dll還有另外幾個運行時庫都放到exe旁邊即可,然並卵。。。,在win7的測試機上還會提示找不到這個dll:api-ms-win-crt-runtime-l1-1-0 ...
  • 這篇博客總結了1天,希望自己以後返回來看的時候理解更深刻,也希望可以起到幫助初學者的作用. 轉載請註明 出自 : "luogg的博客園" , 因為前不久偶然發現某網站直接複製粘貼我的博客,交談之後他們修改了出處. 封裝 一, 封裝的概念 1. 類可以看成一個封裝體,將對象的屬性和方法封裝到類中. 2 ...
  • 在開發過程當中需要用到配置信息,這些信息不能進行硬編碼,這時配置文件是一個比較好的方式,java提供了properties格式的文件,以鍵值對的方式保存信息,在讀取的時候通過鍵獲得鍵對應的值,spring提供了讀取properties文件的支持,下麵看具體的配置, 一、<context:proper ...
  • --> 斷點續傳: 就像迅雷下載文件一樣,停止下載或關閉程式,下次下載時是從上次下載的地方開始繼續進行,而不是重頭開始... --> RandomAccessFile --> pointer(文件指針) --> seek(移動文件指針) --> 斷點續傳 --> 通過複製來模擬簡單的斷點續傳... ...
  • 什麼是延遲載入? 延遲載入是指當應用程式想要從資料庫獲取對象時(在沒有設置lazy屬性值為false),Hibernate只是從資料庫獲取符合條件的對象的OId從而生成代理對象,並沒有載入出對象 訪問該對象的屬性時才會載入出相應的值。簡答來說就是儘可能的減少查詢的數據量。 如何配置延遲載入 在Hib... ...
  • 原文轉自 http://www.cnblogs.com/ldms/p/4565547.html Yii 有很多 extension 可以使用,在查看了 Yii 官網上提供的與 OAuth 相關的擴展後,發現了幾個 OAuth2 的客戶端擴展,但是並沒有找到可以作為 OAuth2 Server 的擴展 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...