溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何在php項(xiàng)目中共享session

發(fā)布時間:2021-02-08 16:59:58 來源:億速云 閱讀:186 作者:Leah 欄目:開發(fā)技術(shù)

如何在php項(xiàng)目中共享session?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

PHP的session原理?

客戶端訪問php頁面,執(zhí)行session_start,生成session_id,一般我們是把session_id存儲到cookie上,session內(nèi)容保存在服務(wù)端,

客戶端訪問訪問不同的頁面都會把session_id傳到服務(wù)端,通過session_id來獲取session內(nèi)容。

流程是這樣,可是不同的服務(wù)器會對同一個客戶端產(chǎn)生不同的session_id,這樣的話不同服務(wù)器就不能得到相同的session內(nèi)容。

而且PHP 默認(rèn)的 SESSION 數(shù)據(jù)都是分別保存在本服務(wù)器的文件系統(tǒng)中。

所以我們要解決session共享,就必須解決兩個問題:

多臺服務(wù)器用同一個session_id

這個比較容易解決,只要在php中設(shè)置存session_id的cookie域名為網(wǎng)站主域就可以

打開PHP.ini, 設(shè)置session.cookie_domain = .feiniu.com,

當(dāng)然也可以在php代碼當(dāng)中設(shè)置ini_set("session.cookie_domain","feiniu.com");

多臺服務(wù)器用同一個session_id訪問到相同的session內(nèi)容

要實(shí)現(xiàn)這點(diǎn),就必須把session內(nèi)容存儲到讓所有服務(wù)器都能訪問到的地方,php的session內(nèi)容是默認(rèn)存儲到本服務(wù)器的文件中的,

一般的解決方案是存入數(shù)據(jù)庫,memcache或者redis這種緩存服務(wù)器,當(dāng)然用默認(rèn)的文件存儲方式也可以,用NFS統(tǒng)一存儲。

如何選擇存儲引擎?

默認(rèn)文件存儲:

這種方式的session銷毀依托于php垃圾收集器,在高并發(fā)或銷毀時間較長的情況下,在SESSION目錄下產(chǎn)生大量文件,當(dāng)然可以設(shè)置

分級目錄進(jìn)行 SESSION 文件的保存。

這會導(dǎo)致兩個問題:第一、查找文件慢;第二,每個目錄下可容納的文件數(shù)是有限的,可能會導(dǎo)致新SESSION儲存失敗。

數(shù)據(jù)庫存儲:

把Session存儲在數(shù)據(jù)庫里可以防止Session數(shù)據(jù)被垃圾收集器刪除,可以固化存儲session數(shù)據(jù)。

但是用數(shù)據(jù)庫來同步session,會加大數(shù)據(jù)庫的IO,增加數(shù)據(jù)庫的負(fù)擔(dān)。而且數(shù)據(jù)庫讀寫速度較慢,不利于session的適時同步。

memcache存儲:

以這種方式來同步session,不會加大數(shù)據(jù)庫的負(fù)擔(dān),并且安全性比較高,把session放到內(nèi)存里面,比從文件中讀取要快很多。

但是memcache把內(nèi)存分成很多種規(guī)格的存儲塊,有塊就有大小,這種方式也就決定了,memcache不能完全利用內(nèi)存,會產(chǎn)生內(nèi)存碎片,

如果存儲塊不足,還會產(chǎn)生內(nèi)存溢出。

那些不需要“分布”的,不需要共享的,或者干脆規(guī)模小到只有一臺服務(wù)器的應(yīng)用,memcached不會帶來任何好處,相反還會拖慢系統(tǒng)

效率,因?yàn)榫W(wǎng)絡(luò)連接同樣需要資源。

redis存儲:與memcache相比,redis訪問稍稍慢一點(diǎn)點(diǎn),好處是:

redis支持的數(shù)據(jù)結(jié)構(gòu)較多,可以存儲數(shù)組或?qū)ο螅鴐emcache只能存儲字符串。

在session機(jī)器重啟的情況下,memcache所有用戶都必須重新獲得 session,而redis不會。3.在突然涌來大量用戶產(chǎn)生了很多數(shù)據(jù)把

存儲 session 的機(jī)器內(nèi)存占滿了的情況下,memcache會罷工,所有key都沒過期的話就不停的覆蓋最后寫入的數(shù)據(jù),而redis只是會變

慢,不會影響程序的邏輯

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI