PHP是 如何實(shí)現(xiàn) 多服務(wù)器SESSION 共享 的
瀏覽量: 次 發(fā)布日期:2023-09-14 19:59:25
PHP是 如何實(shí)現(xiàn) 多服務(wù)器SESSION 共享 的
商務(wù)合作加微信:2230304070
學(xué)習(xí)與交流:PHP技術(shù)交流微信群
2023年 JetBrains全家桶通用 未使用的賬號(hào) 正版授權(quán) 一人一號(hào)
https://web.52shizhan.cn/activity/xqt8ly
在多服務(wù)器環(huán)境下,使用 SESSION 共享的主要目的是確保用戶在不同服務(wù)器之間的會(huì)話狀態(tài)的一致性。以下是一些常見的情況和原因:
1 負(fù)載均衡:當(dāng)使用負(fù)載均衡器將請(qǐng)求分發(fā)給多個(gè)服務(wù)器時(shí),每個(gè)請(qǐng)求可能被路由到不同的服務(wù)器上。
如果不進(jìn)行 SESSION 共享,用戶在一個(gè)服務(wù)器上登錄后,再次請(qǐng)求時(shí)可能被路由到另一個(gè)服務(wù)器,導(dǎo)致登錄狀態(tài)丟失,用戶需要重新登錄。通過 SESSION 共享,可以確保用戶的會(huì)話狀態(tài)在多個(gè)服務(wù)器之間共享,使用戶無論被路由到哪個(gè)服務(wù)器,都能保持登錄狀態(tài)。
2 水平擴(kuò)展:在需要擴(kuò)展應(yīng)用程序的情況下,可能需要添加更多的服務(wù)器來處理更大的負(fù)載。如果每個(gè)服務(wù)器都有自己的 SESSION 存儲(chǔ),那么用戶在不同服務(wù)器之間切換時(shí)會(huì)話狀態(tài)將丟失。
通過 SESSION 共享,可以將用戶的會(huì)話狀態(tài)存儲(chǔ)在共享存儲(chǔ)中,使多個(gè)服務(wù)器都可以訪問和更新這些會(huì)話數(shù)據(jù)。
3 共享數(shù)據(jù):有時(shí),應(yīng)用程序需要在不同的服務(wù)器之間共享一些重要的數(shù)據(jù),例如購物車內(nèi)容、用戶首選項(xiàng)等。
通過 SESSION 共享,可以將這些共享數(shù)據(jù)存儲(chǔ)在共享存儲(chǔ)中,以便所有服務(wù)器都可以訪問和更新這些數(shù)據(jù),確保數(shù)據(jù)的一致性和實(shí)時(shí)性。
需要注意的是,SESSION 共享需要謹(jǐn)慎處理,確保數(shù)據(jù)的安全性和一致性。共享存儲(chǔ)后端的性能和可靠性也是需要考慮的因素。
PHP的session原理
PHP 的 Session 是一種在 Web 應(yīng)用中跟蹤用戶狀態(tài)的機(jī)制。它基于服務(wù)器端存儲(chǔ)和客戶端 Cookie,并通過唯一的 Session ID 進(jìn)行關(guān)聯(lián)。
以下是 PHP Session 的基本工作原理:
1 客戶端發(fā)送請(qǐng)求:當(dāng)客戶端(通常是瀏覽器)發(fā)送請(qǐng)求到服務(wù)器時(shí),服務(wù)器會(huì)為該客戶端創(chuàng)建一個(gè)唯一的 Session ID,并將該 Session ID 存儲(chǔ)在客戶端的 Cookie 中(通常名為 PHPSESSID)。
2 服務(wù)器創(chuàng)建 Session 文件:服務(wù)器收到請(qǐng)求后,會(huì)根據(jù) Session ID 創(chuàng)建一個(gè)對(duì)應(yīng)的 Session 文件。這個(gè)文件默認(rèn)存儲(chǔ)在服務(wù)器上指定的臨時(shí)目錄中,可以通過 session.save_path 配置項(xiàng)進(jìn)行設(shè)置。
3 Session 數(shù)據(jù)存儲(chǔ):服務(wù)器將需要存儲(chǔ)的數(shù)據(jù)(如用戶的登錄狀態(tài)、購物車內(nèi)容等)保存到 Session 文件中。這些數(shù)據(jù)可以通過超全局變量 $_SESSION 來訪問和操作。
4 Session ID 關(guān)聯(lián):服務(wù)器會(huì)將該 Session ID 關(guān)聯(lián)到當(dāng)前用戶的請(qǐng)求,以便后續(xù)請(qǐng)求可以通過該 Session ID 進(jìn)行識(shí)別和檢索相應(yīng)的 Session 數(shù)據(jù)。
5 數(shù)據(jù)傳遞和更新:在后續(xù)的請(qǐng)求中,客戶端會(huì)在請(qǐng)求中的 Cookie 中攜帶 Session ID,服務(wù)器通過該 Session ID 查找對(duì)應(yīng)的 Session 文件,并獲取存儲(chǔ)的 Session 數(shù)據(jù)。這樣,服務(wù)器可以讀取和更新 Session 數(shù)據(jù),以保持用戶狀態(tài)的一致性。
6 Session 銷毀:Session 可以有一個(gè)過期時(shí)間,一旦超過過期時(shí)間,服務(wù)器會(huì)將對(duì)應(yīng)的 Session 文件刪除,并在客戶端的 Cookie 中刪除相應(yīng)的 Session ID。
需要注意的是,默認(rèn)情況下,PHP 的 Session 使用文件來存儲(chǔ)數(shù)據(jù)。但也可以使用其他存儲(chǔ)介質(zhì),如數(shù)據(jù)庫、緩存服務(wù)器(如 Redis、Memcached)等,通過配置 session.save_handler 和 session.save_path 進(jìn)行指定。
通過 Session,PHP 提供了一種跨頁面和跨請(qǐng)求的狀態(tài)管理機(jī)制,使得開發(fā)者可以方便地在 Web 應(yīng)用中存儲(chǔ)和獲取用戶的狀態(tài)信息。
所以我們要解決session共享,就必須解決兩個(gè)問題:
1. 多臺(tái)服務(wù)器用同一個(gè)session_id
這個(gè)比較容易解決,只要在php中設(shè)置存的域名
為網(wǎng)站主域就可以了
打開, 設(shè)置
當(dāng)然也可以在php代碼當(dāng)中
2. 多臺(tái)服務(wù)器用同一個(gè)session_id訪問到相同的session內(nèi)容
3. 如何選擇存儲(chǔ)引擎
默認(rèn)文件存儲(chǔ):這種方式的session銷毀依托于php垃圾收集器,在高并發(fā)或銷毀時(shí)間較長(zhǎng)的情況下,在SESSION目錄下產(chǎn)生大量文件,當(dāng)然可以設(shè)置分級(jí)目錄進(jìn)行 SESSION 文件的保存。
這會(huì)導(dǎo)致兩個(gè)問題:第一、查找文件慢;第二,每個(gè)目錄下可容納的文件數(shù)是有限的,可能會(huì)導(dǎo)致新SESSION儲(chǔ)存失敗。
1) 設(shè)置Session存儲(chǔ)的引擎,php.ini 文件
2)默認(rèn)情況下的Session的使用
3)在服務(wù)器中存儲(chǔ)的形式是這樣的
數(shù)據(jù)庫存儲(chǔ):把Session存儲(chǔ)在數(shù)據(jù)庫里可以防止Session數(shù)據(jù)被垃圾收集器刪除,可以固化存儲(chǔ)session數(shù)據(jù)。但是用數(shù)據(jù)庫來同步session,會(huì)加大數(shù)據(jù)庫的IO,增加數(shù)據(jù)庫的負(fù)擔(dān)。而且數(shù)據(jù)庫讀寫速度較慢,不利于session的適時(shí)同步。
memcache存儲(chǔ):
以這種方式來同步session,不會(huì)加大數(shù)據(jù)庫的負(fù)擔(dān),并且安全性比較高,把session放到內(nèi)存里面,比從文件中讀取要快很多。
但是memcache把內(nèi)存分成很多種規(guī)格的存儲(chǔ)塊,有塊就有大小,這種方式也就決定了,memcache不能完全利用內(nèi)存,會(huì)產(chǎn)生內(nèi)存碎片,如果存儲(chǔ)塊不足,還會(huì)產(chǎn)生內(nèi)存溢出
那些不需要“分布”的,不需要共享的,或者干脆規(guī)模小到只有一臺(tái)服務(wù)器的應(yīng)用,memcached不會(huì)帶來任何好處,相反還會(huì)拖慢系統(tǒng)效率,因?yàn)榫W(wǎng)絡(luò)連接同樣需要資源。
Redis存儲(chǔ):
與memcache相比,redis訪問稍稍慢一點(diǎn)點(diǎn),好處是:redis支持的數(shù)據(jù)結(jié)構(gòu)較多,可以存儲(chǔ)數(shù)組或?qū)ο螅鴐emcache只能存儲(chǔ)字符串。
在session機(jī)器重啟的情況下,memcache所有用戶都必須重新獲得 session,而redis不會(huì)在突然涌來大量用戶產(chǎn)生了很多數(shù)據(jù)把存儲(chǔ) session 的機(jī)器內(nèi)存占滿了的情況下,memcache 會(huì)罷工,所有 key 都沒過期的話就不停的覆蓋最后寫入的數(shù)據(jù),而 redis 只是會(huì)變慢 ,不會(huì)影響程序的邏輯。
1)設(shè)置php.ini 文件中的session.save_handle 和session.save_path
注1:如果連接的是遠(yuǎn)程redis,需要將localhost換成對(duì)應(yīng)的遠(yuǎn)程ip地址。像這樣
注2:如果為redis已經(jīng)添加了auth權(quán)限(requirpass),session.save_path項(xiàng)則應(yīng)該這樣寫
2)使用redis存儲(chǔ)session信息
在redis上是以這樣的形式進(jìn)行存儲(chǔ)的
封裝session類 b.php
session類的使用:d.php
redis中顯示:
參考鏈接: 以上就是本篇分鐘的全部?jī)?nèi)容,希望各位程序員們努力提升個(gè)人技術(shù)。最后,小編溫馨提示:每天閱讀5分鐘,每天學(xué)習(xí)一點(diǎn)點(diǎn),每天進(jìn)步一點(diǎn)點(diǎn)。
. 控制器壞了如何修復(fù)視頻,控制器故障排查與視頻修復(fù)技巧解析
. 磁盤陣列硬盤壞了數(shù)據(jù)如何恢復(fù),專業(yè)方法與案例解析
. 固態(tài)硬盤數(shù)據(jù)恢復(fù)騙局,如何識(shí)別與防范
. 移動(dòng)硬盤維修費(fèi)用大概是多少錢,價(jià)格范圍與影響因素全揭秘
. 磁盤陣列維修找哪家,如何選擇可靠的磁盤陣列維修服務(wù)提供商
. 移動(dòng)硬盤維修費(fèi)用大概是多少錢,價(jià)格范圍與影響因素全揭秘
. 移動(dòng)硬盤維修費(fèi)用大概是多少錢,價(jià)格范圍與影響因素全覽
. 硬盤壞了里面的內(nèi)容會(huì)丟嗎,數(shù)據(jù)安全如何保障?
. 達(dá)夢(mèng)數(shù)據(jù)庫多少錢一套,一套多少錢,性能如何?
. 數(shù)據(jù)庫 范式,什么是數(shù)據(jù)庫范式?
. 如何恢復(fù)西數(shù)硬盤數(shù)據(jù),如何恢復(fù)西數(shù)硬盤數(shù)據(jù)——全方位指南
. 顯示所有的數(shù)據(jù)庫的命令為,如何顯示所有數(shù)據(jù)庫
. 硬盤數(shù)據(jù)恢復(fù)現(xiàn)場(chǎng),專業(yè)團(tuán)隊(duì)如何挽回?cái)?shù)據(jù)損失
. 移動(dòng)硬盤要去哪里修理,如何選擇合適的維修服務(wù)
. oracle許可只能找oracle買嗎,是否只能從Oracle官方購買?
. 移動(dòng)硬盤維修點(diǎn),如何選擇可靠的移動(dòng)硬盤維修點(diǎn)
. 開票硬盤數(shù)據(jù)恢復(fù),當(dāng)硬盤故障來襲,如何拯救您的珍貴數(shù)據(jù)
. 如何使用 Oracle 環(huán)境變量,什么是 Oracle 環(huán)境變量