如何在多台web服务器上共享session?
生活随笔
收集整理的這篇文章主要介紹了
如何在多台web服务器上共享session?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
比如:現在有三臺php服務器,且實現了負載均衡,如何讓這三臺web服務器共享session數據?
session數據默認是以文件的形式保存在web服務器的磁盤上,一般都是用戶登錄成功的時候,保存session數據。
同一個用戶登錄后,就會將session保存在某個web服務器上,假設是保存在服務器A上,該用戶訪問網站的其他頁面時,可能請求的就是服務器B或服務器C,但服務器B或服務器C上并沒有該用戶的session文件,這樣,就會導致網站誤認為該用戶未登錄,用戶的登錄狀態丟失的問題。
歸根結底,就是要解決多臺web服務器共享session的問題,至少有以下三種方法:
一、將本該保存在web服務器磁盤上的session數據保存到cookie中 即用cookie會話機制替代session會話機制,將session數據保存到客戶端瀏覽器的cookie中,這樣同一個用戶訪問同一網站時,無論負載均衡到哪臺web服務器,都不用再去服務器請求session數據,而直接獲取客戶端cookie中的session數據。如此,同一個用戶的登錄狀態就不會丟失了。 但這樣做,有三大弊端:把session數據放到客戶端的cookie中,一般都是重要數據(如用戶id、昵稱等),會存在安全問題,但可以將session數據加密后,再存放到cookie中,來降低安全風險。 瀏覽器對單個cookie的數據量大小限制為4K左右,因此會存在數據量的限制問題。 影響帶寬性能,降低了頁面的訪問速度。在高訪問量的情況下,用戶每次請求時,都要將客戶端cookie中的session數據發送到服務器,要占用較多的帶寬,進而影響訪問速度,服務器帶寬成本增高。
二、將本該保存在web服務器磁盤上的session數據保存到MySQL數據庫中 sessionid還是利用cookie機制存儲到客戶端,但session數據卻存放在MySQL服務器上。(需要建立sessionid和session數據行的對應關系) 但這樣做,只適合訪問量比較小的網站。如果網站的訪問量比較大,對MySQL服務器會造成很大壓力。因為每次用戶請求頁面(即使是刷新頁面)都要查詢MySQL數據庫中的session數據表,進而判斷用戶的登錄狀態和讀取用戶相關信息,勢必會對數據庫服務器造成很大壓力,這樣就會降低服務器的響應速度,影響用戶體驗。
三、將本該保存在web服務器磁盤上的session數據保存到內存數據庫(memcache或redis)中 memcache或redis是基于內存存儲數據的,性能很高,尤其是高并發的情況下尤為合適。主要是因為從內存中讀取數據要比從磁盤讀取數據快很多。 內存數據庫還支持數據過期失效的機制,正好與session的過期機制對應,推薦使用redis內存數據庫,因為它比memcache支持更多的 數據類型,且支持內存數據備份到磁盤。
這里簡單說一下,后面兩種方法的注意要點:
一、將本該保存在web服務器磁盤上的session數據保存到cookie中 即用cookie會話機制替代session會話機制,將session數據保存到客戶端瀏覽器的cookie中,這樣同一個用戶訪問同一網站時,無論負載均衡到哪臺web服務器,都不用再去服務器請求session數據,而直接獲取客戶端cookie中的session數據。如此,同一個用戶的登錄狀態就不會丟失了。 但這樣做,有三大弊端:
二、將本該保存在web服務器磁盤上的session數據保存到MySQL數據庫中 sessionid還是利用cookie機制存儲到客戶端,但session數據卻存放在MySQL服務器上。(需要建立sessionid和session數據行的對應關系) 但這樣做,只適合訪問量比較小的網站。如果網站的訪問量比較大,對MySQL服務器會造成很大壓力。因為每次用戶請求頁面(即使是刷新頁面)都要查詢MySQL數據庫中的session數據表,進而判斷用戶的登錄狀態和讀取用戶相關信息,勢必會對數據庫服務器造成很大壓力,這樣就會降低服務器的響應速度,影響用戶體驗。
三、將本該保存在web服務器磁盤上的session數據保存到內存數據庫(memcache或redis)中 memcache或redis是基于內存存儲數據的,性能很高,尤其是高并發的情況下尤為合適。主要是因為從內存中讀取數據要比從磁盤讀取數據快很多。 內存數據庫還支持數據過期失效的機制,正好與session的過期機制對應,推薦使用redis內存數據庫,因為它比memcache支持更多的 數據類型,且支持內存數據備份到磁盤。
這里簡單說一下,后面兩種方法的注意要點:
- 如果多臺web服務器對應的是不同的域名,為了保證cookie的唯一(同一個cookie在各個域名有效),需要修改php.ini文件中的session.cookie_domain
- 由于后面兩種方法,屬于用戶自定義的方式管理session,而非默認的文件處理方式,故需修改php.ini中的session.save_handler=user
- 在開啟session之前(即調用session_start()之前),需要先調用session_set_save_handler,關于session_set_save_handler的具體用法,請參考php手冊
來源:http://blog.csdn.net/lamp_yang_3533/article/details/51984201
總結
以上是生活随笔為你收集整理的如何在多台web服务器上共享session?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP中设置一个严格30分钟过期Sess
- 下一篇: 镇江市各小区物业费收费标准到哪里查询