PHP是 如何實現 多服務器SESSION 共享 的
瀏覽量: 次 發布日期:2023-09-14 19:59:25
PHP是 如何實現 多服務器SESSION 共享 的
商務合作加微信:2230304070
學習與交流:PHP技術交流微信群
2023年 JetBrains全家桶通用 未使用的賬號 正版授權 一人一號
https://web.52shizhan.cn/activity/xqt8ly
在多服務器環境下,使用 SESSION 共享的主要目的是確保用戶在不同服務器之間的會話狀態的一致性。以下是一些常見的情況和原因:
1 負載均衡:當使用負載均衡器將請求分發給多個服務器時,每個請求可能被路由到不同的服務器上。
如果不進行 SESSION 共享,用戶在一個服務器上登錄后,再次請求時可能被路由到另一個服務器,導致登錄狀態丟失,用戶需要重新登錄。通過 SESSION 共享,可以確保用戶的會話狀態在多個服務器之間共享,使用戶無論被路由到哪個服務器,都能保持登錄狀態。
2 水平擴展:在需要擴展應用程序的情況下,可能需要添加更多的服務器來處理更大的負載。如果每個服務器都有自己的 SESSION 存儲,那么用戶在不同服務器之間切換時會話狀態將丟失。
通過 SESSION 共享,可以將用戶的會話狀態存儲在共享存儲中,使多個服務器都可以訪問和更新這些會話數據。
3 共享數據:有時,應用程序需要在不同的服務器之間共享一些重要的數據,例如購物車內容、用戶首選項等。
通過 SESSION 共享,可以將這些共享數據存儲在共享存儲中,以便所有服務器都可以訪問和更新這些數據,確保數據的一致性和實時性。
需要注意的是,SESSION 共享需要謹慎處理,確保數據的安全性和一致性。共享存儲后端的性能和可靠性也是需要考慮的因素。
PHP的session原理
PHP 的 Session 是一種在 Web 應用中跟蹤用戶狀態的機制。它基于服務器端存儲和客戶端 Cookie,并通過唯一的 Session ID 進行關聯。
以下是 PHP Session 的基本工作原理:
1 客戶端發送請求:當客戶端(通常是瀏覽器)發送請求到服務器時,服務器會為該客戶端創建一個唯一的 Session ID,并將該 Session ID 存儲在客戶端的 Cookie 中(通常名為 PHPSESSID)。
2 服務器創建 Session 文件:服務器收到請求后,會根據 Session ID 創建一個對應的 Session 文件。這個文件默認存儲在服務器上指定的臨時目錄中,可以通過 session.save_path 配置項進行設置。
3 Session 數據存儲:服務器將需要存儲的數據(如用戶的登錄狀態、購物車內容等)保存到 Session 文件中。這些數據可以通過超全局變量 $_SESSION 來訪問和操作。
4 Session ID 關聯:服務器會將該 Session ID 關聯到當前用戶的請求,以便后續請求可以通過該 Session ID 進行識別和檢索相應的 Session 數據。
5 數據傳遞和更新:在后續的請求中,客戶端會在請求中的 Cookie 中攜帶 Session ID,服務器通過該 Session ID 查找對應的 Session 文件,并獲取存儲的 Session 數據。這樣,服務器可以讀取和更新 Session 數據,以保持用戶狀態的一致性。
6 Session 銷毀:Session 可以有一個過期時間,一旦超過過期時間,服務器會將對應的 Session 文件刪除,并在客戶端的 Cookie 中刪除相應的 Session ID。
需要注意的是,默認情況下,PHP 的 Session 使用文件來存儲數據。但也可以使用其他存儲介質,如數據庫、緩存服務器(如 Redis、Memcached)等,通過配置 session.save_handler 和 session.save_path 進行指定。
通過 Session,PHP 提供了一種跨頁面和跨請求的狀態管理機制,使得開發者可以方便地在 Web 應用中存儲和獲取用戶的狀態信息。
所以我們要解決session共享,就必須解決兩個問題:
1. 多臺服務器用同一個session_id
這個比較容易解決,只要在php中設置存的域名
為網站主域就可以了
打開, 設置
當然也可以在php代碼當中
2. 多臺服務器用同一個session_id訪問到相同的session內容
3. 如何選擇存儲引擎
默認文件存儲:這種方式的session銷毀依托于php垃圾收集器,在高并發或銷毀時間較長的情況下,在SESSION目錄下產生大量文件,當然可以設置分級目錄進行 SESSION 文件的保存。
這會導致兩個問題:第一、查找文件慢;第二,每個目錄下可容納的文件數是有限的,可能會導致新SESSION儲存失敗。
1) 設置Session存儲的引擎,php.ini 文件
2)默認情況下的Session的使用
3)在服務器中存儲的形式是這樣的
數據庫存儲:把Session存儲在數據庫里可以防止Session數據被垃圾收集器刪除,可以固化存儲session數據。但是用數據庫來同步session,會加大數據庫的IO,增加數據庫的負擔。而且數據庫讀寫速度較慢,不利于session的適時同步。
memcache存儲:
以這種方式來同步session,不會加大數據庫的負擔,并且安全性比較高,把session放到內存里面,比從文件中讀取要快很多。
但是memcache把內存分成很多種規格的存儲塊,有塊就有大小,這種方式也就決定了,memcache不能完全利用內存,會產生內存碎片,如果存儲塊不足,還會產生內存溢出
那些不需要“分布”的,不需要共享的,或者干脆規模小到只有一臺服務器的應用,memcached不會帶來任何好處,相反還會拖慢系統效率,因為網絡連接同樣需要資源。
Redis存儲:
與memcache相比,redis訪問稍稍慢一點點,好處是:redis支持的數據結構較多,可以存儲數組或對象,而memcache只能存儲字符串。
在session機器重啟的情況下,memcache所有用戶都必須重新獲得 session,而redis不會在突然涌來大量用戶產生了很多數據把存儲 session 的機器內存占滿了的情況下,memcache 會罷工,所有 key 都沒過期的話就不停的覆蓋最后寫入的數據,而 redis 只是會變慢 ,不會影響程序的邏輯。
1)設置php.ini 文件中的session.save_handle 和session.save_path
注1:如果連接的是遠程redis,需要將localhost換成對應的遠程ip地址。像這樣
注2:如果為redis已經添加了auth權限(requirpass),session.save_path項則應該這樣寫
2)使用redis存儲session信息
在redis上是以這樣的形式進行存儲的
封裝session類 b.php
session類的使用:d.php
redis中顯示:
參考鏈接: 以上就是本篇分鐘的全部內容,希望各位程序員們努力提升個人技術。最后,小編溫馨提示:每天閱讀5分鐘,每天學習一點點,每天進步一點點。