一、為什么要共享session?
(1)首先要想知道為什么要session共享,必須先了解一下session原理,這樣有助於我更好的了解session的共享,
默認情況下,php的session文件是保存在磁盤文件中。在php.ini配置文件中的配置項如下:
session.save_handler = files
session.save_path = "N;/path"
第一個配置項是指定使用files(文件形式)存儲session數據。
第二個參數指定保存的路徑。N表示生成多少級目錄(不放到一個目錄下,分散到多個磁盤目錄中去)
session原理詳解鏈接 http://www.cnblogs.com/wangtao_20/archive/2011/02/16/1955659.html
(2)我的理解是單一后端服務器是不存在session共享問題的。因為session數據保存在一台服務器上。但是做了web集群后,因為通過負載均衡,同一個IP訪問同一個頁面會被分配到不同的服務器上,
如果session不同步的話,一個登錄用戶,一會是登錄狀態,
一會又不是登錄狀態。這樣子登錄保存的session數據就需要進行共享了。
下圖來自互聯網:
二、session共享的方法
(1)session保存在數據庫
我理解本質是:自己寫程序(php,java都可以實現,反正是保存在數據庫中)模擬實現session的機制。
具體為,把以前存儲在文件中的session數據存儲到數據庫中去,那么這樣做,其實就不用到php內置的session機制了(像session_start()之類的函數都不需要去用了)。寫程序要模擬的是,從數據庫拿session數據,約定什么情況下數據過期了然后自動清理,
這里是指刪除數據庫中的行。保存在文件中的時候,php有垃圾回收機制會去自動清理過期的session文件。
多服務器session同步的兩種方法:
1,用一個低端電腦建個數據庫專門存放web服務器的session,或者,把這個專門的數據庫建在文件服務器上,用戶訪問web服務器時,會去這個專門的數據庫check一下session的情況,以達到session同步的目的。
2,這種方法是把存放session的表和其他數據庫表放在一起,如果MySQL也做了集群了話,每個mysql節點都要有這張表,並且這張session表的數據表要實時同步。
優點:擴展性很強,可以隨意增加WEB而不受影響。放在數據庫里面安全方面好。
缺點:用數據庫來同步session,訪問量小沒有問題,如果大流量網站的話會加大數據庫的壓力,因為所有對session的操作都要進行數據庫的操作。數據庫本來就是容易產生瓶頸的地方,
如果把session還放到數據庫里面,無疑是雪上加霜。高並發訪問的情況下,會出現很大的性能問題。
(2)session數據存儲到客戶端的cookie中
這樣子,就不需要涉及到數據共享了。a客戶端請求的時候,原來生成在服務器的數據生成到瀏覽器的cookie中,根據cookie中的數據識別用戶。
php由原來的”從本地(也就是服務器)磁盤上讀取session數據”轉變為”瀏覽器的cookie中讀取數據”,這樣子,
在多台php服務器負載均衡的情況下,即便第一秒請求是a服務器,第二秒請求是b服務器,都不需要管哪台服務器了。反正都是讀取客戶端上的cookie數據。
一般是把session數據按照自己定義的加密規則,加密后后存在cookie中。
優點:服務器的壓力減小了,因為session數據不存在服務器磁盤上。根本就不會出現session讀取不到的問題。
缺點:網絡請求占用很多。每次請求時,客戶端都要通過cookie發送session數據給服務器;另外,瀏覽器對cookie的大小存在限制。每個瀏覽器限制是不同的。
第二方面是安全問題:把session數據放到客戶端,一般session中存的都是重要性數據(帳號、昵稱、用戶id等),會存在安全問題。
(3)用Nosql數據庫Redis或者memcache同步session,基於內存存儲數據的性能很高,用戶並發量很大的時候尤其合適
主要是利用內存的數據讀取速度是很快的,與磁盤讀取的速度不是一個數量級的。
使用內存存儲:方便統計在線人數,內存的速度比磁盤訪問快、內存數據庫系統能夠控制內存中的過期數據自動失效(剛好符合session過期需要)。
Redis或memcache可以做分布式,如果沒有這功能,他也不能用來做session同步。他可以把web服務器中的內存組合起來,成為一個"內存池",不管是哪個服務器產生的sessoin都可以放到這個"內存池"中,其他的都可以使用。
優點:以這種方式來同步session,不會加大數據庫的負擔,並且安全性比用cookie大大的提高,把session放到內存里面,比從文件中讀取要快很多。
缺點:redis或memcache把內存分成很多種規格的存儲塊,有塊就有大小,這種方式也就決定了,memcache不能完全利用內存,會產生內存碎片,如果存儲塊不足,還會產生內存溢出。
==========================我是知識的搬運工========================