php實(shí)現(xiàn)session共享的實(shí)例方法
為什么要session共享?
現(xiàn)在稍微大一點(diǎn)的網(wǎng)站基本上都有好幾個(gè)子域名,比如www.xz577.com, xz577.com, vip.xz577.com,這些網(wǎng)站如果需要共用用戶登錄信息,那么就需要做到session共享,當(dāng)然前提是有相同的主域名。
PHP的session原理?
客戶端訪問(wèn)php頁(yè)面,執(zhí)行session_start,生成session_id,一般我們是把session_id存儲(chǔ)到cookie上,session內(nèi)容保存在服務(wù)端,
客戶端訪問(wèn)訪問(wèn)不同的頁(yè)面都會(huì)把session_id傳到服務(wù)端,通過(guò)session_id來(lái)獲取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è)問(wèn)題:
多臺(tái)服務(wù)器用同一個(gè)session_id
這個(gè)比較容易解決,只要在php中設(shè)置存session_id的cookie域名為網(wǎng)站主域就可以
打開(kāi)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訪問(wèn)到相同的session內(nèi)容
要實(shí)現(xiàn)這點(diǎn),就必須把session內(nèi)容存儲(chǔ)到讓所有服務(wù)器都能訪問(wèn)到的地方,php的session內(nèi)容是默認(rèn)存儲(chǔ)到本服務(wù)器的文件中的,
一般的解決方案是存入數(shù)據(jù)庫(kù),memcache或者redis這種緩存服務(wù)器,當(dāng)然用默認(rèn)的文件存儲(chǔ)方式也可以,用NFS統(tǒng)一存儲(chǔ)。
如何選擇存儲(chǔ)引擎?
默認(rèn)文件存儲(chǔ):
這種方式的session銷(xiāo)毀依托于php垃圾收集器,在高并發(fā)或銷(xiāo)毀時(shí)間較長(zhǎng)的情況下,在SESSION目錄下產(chǎn)生大量文件,當(dāng)然可以設(shè)置
分級(jí)目錄進(jìn)行 SESSION 文件的保存。
這會(huì)導(dǎo)致兩個(gè)問(wèn)題:第一、查找文件慢;第二,每個(gè)目錄下可容納的文件數(shù)是有限的,可能會(huì)導(dǎo)致新SESSION儲(chǔ)存失敗。
數(shù)據(jù)庫(kù)存儲(chǔ):
把Session存儲(chǔ)在數(shù)據(jù)庫(kù)里可以防止Session數(shù)據(jù)被垃圾收集器刪除,可以固化存儲(chǔ)session數(shù)據(jù)。
但是用數(shù)據(jù)庫(kù)來(lái)同步session,會(huì)加大數(shù)據(jù)庫(kù)的IO,增加數(shù)據(jù)庫(kù)的負(fù)擔(dān)。而且數(shù)據(jù)庫(kù)讀寫(xiě)速度較慢,不利于session的適時(shí)同步。
memcache存儲(chǔ):
以這種方式來(lái)同步session,不會(huì)加大數(shù)據(jù)庫(kù)的負(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ì)帶來(lái)任何好處,相反還會(huì)拖慢系統(tǒng)
效率,因?yàn)榫W(wǎng)絡(luò)連接同樣需要資源。
redis存儲(chǔ):與memcache相比,redis訪問(wèn)稍稍慢一點(diǎn)點(diǎn),好處是:
redis支持的數(shù)據(jù)結(jié)構(gòu)較多,可以存儲(chǔ)數(shù)組或?qū)ο螅鴐emcache只能存儲(chǔ)字符串。
在session機(jī)器重啟的情況下,memcache所有用戶都必須重新獲得 session,而redis不會(huì)。3.在突然涌來(lái)大量用戶產(chǎn)生了很多數(shù)據(jù)把
存儲(chǔ) session 的機(jī)器內(nèi)存占滿了的情況下,memcache會(huì)罷工,所有key都沒(méi)過(guò)期的話就不停的覆蓋最后寫(xiě)入的數(shù)據(jù),而redis只是會(huì)變
慢,不會(huì)影響程序的邏輯
相關(guān)文章
php 格式化數(shù)字的時(shí)候注意數(shù)字的范圍
因?yàn)?數(shù)據(jù)庫(kù)中 id 可能會(huì)很大 如果使用%d的話,就可能出現(xiàn)因?yàn)槌隽朔秶?而到不到正確的結(jié)果。所以,個(gè)人建議 對(duì)id進(jìn)行格式化的時(shí)候 使用%.0f 比 %d 要 好的多。2010-04-04php 數(shù)組排序 array_multisort與uasort的區(qū)別
其實(shí),簡(jiǎn)單的說(shuō)兩者的最重要的區(qū)別:array_multisort()排序之后,原數(shù)組“鍵”丟失。uasort()排序之后,保留原來(lái)的“鍵”。2011-03-03PHP連接SQLServer2005 的問(wèn)題解決方法
關(guān)于PHP連接MSSQL這個(gè)問(wèn)題煩了我好幾天,一開(kāi)始在XP上怎么試也不行,MSSQL模塊怎么也加載不上。2010-07-07php實(shí)現(xiàn)指定字符串中查找子字符串的方法
這篇文章主要介紹了php實(shí)現(xiàn)指定字符串中查找子字符串的方法,涉及php中strpos()函數(shù)查找字符串的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03PHP彈出提示框并跳轉(zhuǎn)到新頁(yè)面即重定向到新頁(yè)面
本文為大家介紹下使用PHP彈出提示框并跳轉(zhuǎn)到新頁(yè)面,也就是大家所認(rèn)為的重定向,下面的示例大家可以參考下2014-01-01淺析PHP頁(yè)面局部刷新功能的實(shí)現(xiàn)小結(jié)
本篇文章是對(duì)PHP頁(yè)面局部刷新功能的實(shí)現(xiàn)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP的explode和implode的使用說(shuō)明
下里說(shuō)道php中的explode 和implode的用法,芭蕾舞鞋,盼望對(duì)于友朋們有所輔助!2011-07-07