PHP實現多服務器SESSION共享

PHP實現多服務器SESSION共享

爲什麼要session共享

現在稍微大一點的網站基本上都有好幾個子域名,比如www.feiniu.com, search.feiniu.com, member.feiniu.com,這些網站如果需要共用用戶登錄信息,那麼就需要做到session共享,當然前提是有相同的主域。

PHP的session原理

客戶端訪問php頁面,執行session_start,生成session_id,一般我們是把session_id存儲到cookie上,session內容保存在服務端,客戶端訪問訪問不同的頁面都會把session_id傳到服務端,通過session_id來獲取session內容。

流程是這樣,可是不同的服務器會對同一個客戶端產生不同的session_id,這樣的話不同服務器就不能得到相同的session內容了。而且PHP 默認的 SESSION 數據都是分別保存在本服務器的文件系統中。

所以我們要解決session共享,就必須解決兩個問題:
1. 多臺服務器用同一個session_id

1.這個比較容易解決,只要在php中設置存session_id的cookie域名爲網站主域就可以了
2.打開PHP.ini, 設置session.cookie_domain = .feiniu.com, 
3.當然也可以在php代碼當中設置ini_set("session.cookie_domain","feiniu.com");

2. 多臺服務器用同一個session_id訪問到相同的session內容

1.要實現這點,就必須把session內容存儲到讓所有服務器都能訪問到的地方,php的session內容是默認存儲到本服務器的文件中的,一般的解決方案是存入數據庫,memcache或者redis這種緩存服務器,當然用默認的文件存儲方式也可以,用NFS統一存儲。

2.如何修改session存儲引擎,參考這篇文章:http://blog.csdn.net/yagas/article/details/7593415

3. 如何選擇存儲引擎

默認文件存儲:

1.這種方式的session銷燬依託於php垃圾收集器,在高併發或銷燬時間較長的情況下,在SESSION目錄下產生大量文件,當然可以設置分級目錄進行 SESSION 文件的保存。這會導致兩個問題:第一、查找文件慢;第二,每個目錄下可容納的文件數是有限的,可能會導致新SESSION儲存失敗。


數據庫存儲:

1.把Session存儲在數據庫裏可以防止Session數據被垃圾收集器刪除,可以固化存儲session數據。但是用數據庫來同步session,會加大數據庫的IO,增加數據庫的負擔。而且數據庫讀寫速度較慢,不利於session的適時同步。


memcache存儲: 
1.以這種方式來同步session,不會加大數據庫的負擔,並且安全性比較高,把session放到內存裏面,比從文件中讀取要快很多。

2.但是memcache把內存分成很多種規格的存儲塊,有塊就有大小,這種方式也就決定了,memcache不能完全利用內存,會產生內存碎片,如果存儲塊不足,還會產生內存溢出
3.那些不需要“分佈”的,不需要共享的,或者乾脆規模小到只有一臺服務器的應用,memcached不會帶來任何好處,相反還會拖慢系統效率,因爲網絡連接同樣需要資源。


redis存儲:與memcache相比,redis訪問稍稍慢一點點,好處是: 
1.redis支持的數據結構較多,可以存儲數組或對象,而memcache只能存儲字符串
2.在session機器重啓的情況下,memcache所有用戶都必須重新獲得 session,而redis不會
3.在突然涌來大量用戶產生了很多數據把存儲 session 的機器內存佔滿了的情況下,memcache 會罷工,所有 key 都沒過期的話就不停的覆蓋最後寫入的數據,而 redis 只是會變慢 ,不會影響程序的邏輯
 

轉載:https://blog.csdn.net/xue632777974/article/details/68060837

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章