龔利
摘要:該文分析了在互聯(lián)網(wǎng)上,同一個(gè)網(wǎng)站的模塊分布在不同服務(wù)器上,如何保證用戶登錄子站點(diǎn)服務(wù)器后,在訪問(wèn)另外一個(gè)子站點(diǎn)服務(wù)器相關(guān)功能時(shí),不需要重新登錄即可使用。如何通過(guò)共享Session的設(shè)置,達(dá)到“一次登錄,同一網(wǎng)站的不同服務(wù)器全部通行”的問(wèn)題。并且通過(guò)PHP程序代碼對(duì)其進(jìn)行了實(shí)現(xiàn)。
關(guān)鍵詞:多服務(wù)器;共享;Session
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):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 概述
通常大型網(wǎng)站的服務(wù)器會(huì)使用幾個(gè)服務(wù)器,通過(guò)使用分配二級(jí)域名來(lái)進(jìn)行訪問(wèn)不同的服務(wù)器,每個(gè)服務(wù)器運(yùn)行著不同的功能模塊。一個(gè)整體比較好的網(wǎng)站中,用戶系統(tǒng)應(yīng)該是標(biāo)準(zhǔn)統(tǒng)一的,即:網(wǎng)站登錄的用戶名和密碼可使用于各種模塊。還有一個(gè)問(wèn)題,如何確保用戶在服務(wù)器上登錄后,進(jìn)入另一個(gè)服務(wù)器相關(guān)的模塊,不需要重新登錄使用。用通俗的解釋就是,“只需要一次登錄認(rèn)證,每個(gè)服務(wù)器都可以通過(guò)”的問(wèn)題,為了解決這個(gè)問(wèn)題,需要解決同一個(gè)網(wǎng)站下的每個(gè)服務(wù)器如何實(shí)現(xiàn)共享會(huì)話數(shù)據(jù)Session。
2 Session運(yùn)行機(jī)制
1) Session產(chǎn)生背景
由于互聯(lián)網(wǎng)上HTTP本身是一個(gè)無(wú)狀態(tài)的連接協(xié)議,正因?yàn)檫@種靈活和無(wú)連接的特性,當(dāng)用戶連接訪問(wèn)到一個(gè)網(wǎng)站時(shí),無(wú)法保存和記憶每個(gè)用戶的身份。為了支持客戶端與服務(wù)器之間的交互,我們就需要通過(guò)不同的技術(shù)為用戶和網(wǎng)站訪問(wèn)之前交互保存狀態(tài),這就是Session技術(shù)產(chǎn)生的原因。
2) 什么是Session
Session是從用戶訪問(wèn)頁(yè)面開(kāi)始,到斷開(kāi)與網(wǎng)站連接為止,從而形成了Session的生命周期。每一次用戶連接時(shí),系統(tǒng)會(huì)自動(dòng)生成一個(gè)唯一的SessionID以標(biāo)識(shí)當(dāng)前用戶與其他用戶區(qū)分。在會(huì)話期間,PHP默認(rèn)生成名為PHPSessionID的標(biāo)識(shí),它隨著每一個(gè)頁(yè)面被送往瀏覽器,然后隨下一次頁(yè)面請(qǐng)求返回給web服務(wù)器。
Session通過(guò)ID接受每一個(gè)訪問(wèn)請(qǐng)求,從而識(shí)別當(dāng)前用戶、跟蹤和保持用戶的具體資料,以及Session變量中存儲(chǔ)的數(shù)字或文字資料。
3 多服務(wù)器下共享Session的解決辦法
通過(guò)上面對(duì)Session的工作原理介紹,我們可以發(fā)現(xiàn),默認(rèn)情況下,每個(gè)服務(wù)器向同一客戶分別生成一個(gè)會(huì)話Session ID。如果同一用戶的瀏覽器,訪問(wèn)服務(wù)器A的Session ID為Session_A1,而在B服務(wù)器上產(chǎn)生的ID是Session_B1,并且PHP的Session數(shù)據(jù)分別保存在本服務(wù)器的文件系統(tǒng)中,如圖1所示。
我們發(fā)現(xiàn),Session數(shù)據(jù)要進(jìn)行兩個(gè)服務(wù)器共享,所以對(duì)于同一瀏覽器生成session_id必須是相同的,這個(gè)session_ID可以通過(guò)多個(gè)服務(wù)器之間發(fā)送的Cookie。如果我們給這個(gè)用戶的session被定義為passid。用于Cookie的域(domain)需要特殊的設(shè)置。在這里我們可以使用PHP語(yǔ)句:Ini_set(“session.Cookie_domain”,$domain)。
通常,服務(wù)器的域名或IP地址是Cookie的域(domain),如果域是不同的,各服務(wù)器Cookie不能互相訪問(wèn)。
假設(shè)同一個(gè)網(wǎng)站的兩臺(tái)不同服務(wù)器分別為:A.yytc.net和B.yytc.net,其一級(jí)域名為yytc.net. 則Cookie 的域(domain)可以設(shè)置為.yytc.net,PHP語(yǔ)句為:ini_set(“session.Cookie_domain”, “.yytc.net”);
經(jīng)過(guò)設(shè)置后,兩個(gè)服務(wù)器可以同時(shí)訪問(wèn)cookie,這樣即可以達(dá)到多個(gè)服務(wù)器共享同一個(gè)客戶端的Session ID的目的。
在這里還需要解決另一個(gè)問(wèn)題,是Session的位置和存儲(chǔ)方式必須確保每個(gè)服務(wù)器可以訪問(wèn),即多服務(wù)器共享客戶端的Session ID,并且也必須共享服務(wù)器的Session數(shù)據(jù)。相關(guān)關(guān)鍵程序代碼如下:
先使用SQL語(yǔ)句創(chuàng)建一個(gè)數(shù)據(jù)表,Mysql的語(yǔ)句如下:
CREATE TABLE ‘sessions (
‘p_time bigint(20) NOT NULL default “0”;// p_time變量為Session 過(guò)期時(shí)間
‘s_data longtext NOT NULL,// s_data變量為用來(lái)保存Session 的數(shù)據(jù)
‘s_id varchar(32) NOT NULL default “ ” ;// s_id變量為 Session ID
PRIMARY KEY (`s_id`);
KEY ‘p_time(‘p_time ‘);
)
其中初始化函數(shù) function init( )程序關(guān)鍵代碼實(shí)現(xiàn)如下:
Function init(){ // 初始化init()函數(shù)關(guān)鍵php代碼
…………
$domain=”.yytc.net”;//session的作用域
Ini_set (“session.gc_maxlifetime”, file_time);//設(shè)置session最大生存時(shí)間
Ini_set(“session.use_Cookies”,1); //用Cookie保存 SESSION ID 的方式
Ini_set(“session.Cookie_path”,/);// 設(shè)置默認(rèn)的cookie有效路徑
Ini_set(“session.Cookie_domain”,”.yytc.net”); //設(shè)置多服務(wù)器共享保存 SESSION ID 的 Cookie
Session_module_name(“user”); //將session.save_handler 設(shè)置為 user
Ini_set (“session.use_trans_sid”, 0); //不傳遞session_id
…………
} //初始化init()函數(shù)結(jié)束
4 結(jié)束語(yǔ)
本文主要分析了用戶在登錄同一個(gè)網(wǎng)站不同服務(wù)器中session共享的解決辦法,在實(shí)際操作中極大的方便了用戶的訪問(wèn)。并且通過(guò)PHP程序代碼實(shí)現(xiàn)了多服務(wù)器共享session的實(shí)際案例。
參考文獻(xiàn):
[1] 馬軍.asp網(wǎng)絡(luò)編程從入門(mén)到精通[M].北京:清華大學(xué)出版社,2006:200-217.
[2] 田佳淳.php5 mysql5基礎(chǔ)與實(shí)例教程[M].北京:中國(guó)電力出版社,2007:100-150.