龔利
摘要:該文分析了在互聯(lián)網上,同一個網站的模塊分布在不同服務器上,如何保證用戶登錄子站點服務器后,在訪問另外一個子站點服務器相關功能時,不需要重新登錄即可使用。如何通過共享Session的設置,達到“一次登錄,同一網站的不同服務器全部通行”的問題。并且通過PHP程序代碼對其進行了實現。
關鍵詞:多服務器;共享;Session
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2014)24-5597-02
Analysis of Shared Session Solution in Multi Server
GONG Li
(Yunyang Teachers College, Shiyan 442000, China)
Abstract: This paper analyzes the distribution of a site on the Internet module in different server, how to ensure that the user after the login server, into another server related module, do not need to log back in use. This is the problem of how to achieve "once logged in, the same sites of different servers all traffic" by sharing Session Settings. It is achieved by the PHP code.
Key words: multiple servers; shared; Session
1 概述
通常大型網站的服務器會使用幾個服務器,通過使用分配二級域名來進行訪問不同的服務器,每個服務器運行著不同的功能模塊。一個整體比較好的網站中,用戶系統(tǒng)應該是標準統(tǒng)一的,即:網站登錄的用戶名和密碼可使用于各種模塊。還有一個問題,如何確保用戶在服務器上登錄后,進入另一個服務器相關的模塊,不需要重新登錄使用。用通俗的解釋就是,“只需要一次登錄認證,每個服務器都可以通過”的問題,為了解決這個問題,需要解決同一個網站下的每個服務器如何實現共享會話數據Session。
2 Session運行機制
1) Session產生背景
由于互聯(lián)網上HTTP本身是一個無狀態(tài)的連接協(xié)議,正因為這種靈活和無連接的特性,當用戶連接訪問到一個網站時,無法保存和記憶每個用戶的身份。為了支持客戶端與服務器之間的交互,我們就需要通過不同的技術為用戶和網站訪問之前交互保存狀態(tài),這就是Session技術產生的原因。
2) 什么是Session
Session是從用戶訪問頁面開始,到斷開與網站連接為止,從而形成了Session的生命周期。每一次用戶連接時,系統(tǒng)會自動生成一個唯一的SessionID以標識當前用戶與其他用戶區(qū)分。在會話期間,PHP默認生成名為PHPSessionID的標識,它隨著每一個頁面被送往瀏覽器,然后隨下一次頁面請求返回給web服務器。
Session通過ID接受每一個訪問請求,從而識別當前用戶、跟蹤和保持用戶的具體資料,以及Session變量中存儲的數字或文字資料。
3 多服務器下共享Session的解決辦法
通過上面對Session的工作原理介紹,我們可以發(fā)現,默認情況下,每個服務器向同一客戶分別生成一個會話Session ID。如果同一用戶的瀏覽器,訪問服務器A的Session ID為Session_A1,而在B服務器上產生的ID是Session_B1,并且PHP的Session數據分別保存在本服務器的文件系統(tǒng)中,如圖1所示。
我們發(fā)現,Session數據要進行兩個服務器共享,所以對于同一瀏覽器生成session_id必須是相同的,這個session_ID可以通過多個服務器之間發(fā)送的Cookie。如果我們給這個用戶的session被定義為passid。用于Cookie的域(domain)需要特殊的設置。在這里我們可以使用PHP語句:Ini_set(“session.Cookie_domain”,$domain)。
通常,服務器的域名或IP地址是Cookie的域(domain),如果域是不同的,各服務器Cookie不能互相訪問。
假設同一個網站的兩臺不同服務器分別為:A.yytc.net和B.yytc.net,其一級域名為yytc.net. 則Cookie 的域(domain)可以設置為.yytc.net,PHP語句為:ini_set(“session.Cookie_domain”, “.yytc.net”);
經過設置后,兩個服務器可以同時訪問cookie,這樣即可以達到多個服務器共享同一個客戶端的Session ID的目的。
在這里還需要解決另一個問題,是Session的位置和存儲方式必須確保每個服務器可以訪問,即多服務器共享客戶端的Session ID,并且也必須共享服務器的Session數據。相關關鍵程序代碼如下:
先使用SQL語句創(chuàng)建一個數據表,Mysql的語句如下:
CREATE TABLE ‘sessions (
‘p_time bigint(20) NOT NULL default “0”;// p_time變量為Session 過期時間
‘s_data longtext NOT NULL,// s_data變量為用來保存Session 的數據
‘s_id varchar(32) NOT NULL default “ ” ;// s_id變量為 Session ID
PRIMARY KEY (`s_id`);
KEY ‘p_time(‘p_time ‘);
)
其中初始化函數 function init( )程序關鍵代碼實現如下:
Function init(){ // 初始化init()函數關鍵php代碼
…………
$domain=”.yytc.net”;//session的作用域
Ini_set (“session.gc_maxlifetime”, file_time);//設置session最大生存時間
Ini_set(“session.use_Cookies”,1); //用Cookie保存 SESSION ID 的方式
Ini_set(“session.Cookie_path”,/);// 設置默認的cookie有效路徑
Ini_set(“session.Cookie_domain”,”.yytc.net”); //設置多服務器共享保存 SESSION ID 的 Cookie
Session_module_name(“user”); //將session.save_handler 設置為 user
Ini_set (“session.use_trans_sid”, 0); //不傳遞session_id
…………
} //初始化init()函數結束
4 結束語
本文主要分析了用戶在登錄同一個網站不同服務器中session共享的解決辦法,在實際操作中極大的方便了用戶的訪問。并且通過PHP程序代碼實現了多服務器共享session的實際案例。
參考文獻:
[1] 馬軍.asp網絡編程從入門到精通[M].北京:清華大學出版社,2006:200-217.
[2] 田佳淳.php5 mysql5基礎與實例教程[M].北京:中國電力出版社,2007:100-150.