佳木斯湛栽影视文化发展公司

主頁 > 知識(shí)庫 > php實(shí)現(xiàn)session共享的實(shí)例方法

php實(shí)現(xiàn)session共享的實(shí)例方法

熱門標(biāo)簽:電子圍欄 阿里云 團(tuán)購網(wǎng)站 服務(wù)器配置 Linux服務(wù)器 銀行業(yè)務(wù) 科大訊飛語音識(shí)別系統(tǒng) Mysql連接數(shù)設(shè)置

為什么要session共享?

現(xiàn)在稍微大一點(diǎn)的網(wǎng)站基本上都有好幾個(gè)子域名,比如www.xz577.com, xz577.com, vip.xz577.com,這些網(wǎng)站如果需要共用用戶登錄信息,那么就需要做到session共享,當(dāng)然前提是有相同的主域名。

PHP的session原理?

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

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

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

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

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

多臺(tái)服務(wù)器用同一個(gè)session_id

這個(gè)比較容易解決,只要在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");

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

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

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

如何選擇存儲(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ǔ)存失敗。

數(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ū)ο?,而memcache只能存儲(chǔ)字符串。

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

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

慢,不會(huì)影響程序的邏輯

您可能感興趣的文章:
  • PHP實(shí)現(xiàn)cookie跨域session共享的方法分析
  • PHP使用Redis實(shí)現(xiàn)Session共享的實(shí)現(xiàn)示例
  • PHP實(shí)現(xiàn)負(fù)載均衡session共享redis緩存操作示例
  • PHP簡(jiǎn)單實(shí)現(xiàn)HTTP和HTTPS跨域共享session解決辦法

標(biāo)簽:蚌埠 江蘇 衢州 萍鄉(xiāng) 大理 衡水 棗莊 廣元

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《php實(shí)現(xiàn)session共享的實(shí)例方法》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    苏州市| 茌平县| 正安县| 浙江省| 前郭尔| 凉山| 清涧县| 焦作市| 汉沽区| 金溪县| 肇源县| 襄城县| 陈巴尔虎旗| 民和| 新化县| 偃师市| 牙克石市| 荥经县| 察隅县| 卢龙县| 凤阳县| 浙江省| 泸定县| 竹溪县| 息烽县| 江安县| 黄平县| 新龙县| 东平县| 鹤壁市| 丰顺县| 宁德市| 山西省| 监利县| 如东县| 察隅县| 桦甸市| 西和县| 淮安市| 监利县| 海南省|