1 回答

TA貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個(gè)贊
要實(shí)現(xiàn)多域名共享session,首先就得了解SESSION的運(yùn)行機(jī)制?;靖拍钗揖筒徽f(shuō)了。
session是這樣運(yùn)行的:
用戶(hù)A訪(fǎng)問(wèn)站點(diǎn)Y,如果站點(diǎn)Y執(zhí)行了session_start();(以下假定session_start()總是存在)那么會(huì)產(chǎn)生一個(gè) session_id,這個(gè)session id一般會(huì)以COOKIE的形式保存到用戶(hù)A(我們可以通過(guò)在php.ini里設(shè)置session.use_only_cookies為1,強(qiáng)制SESSION ID必須以COOKIE傳遞。)。這時(shí)候SESSION ID表現(xiàn)為$_COOKIE[’PHPSESSID’];(PHPSESSID可用session_name()函數(shù)來(lái)修改)
用戶(hù)A接著訪(fǎng)問(wèn),這個(gè)session id($_COOKIE[’PHPSESSID’])就會(huì)在A每次訪(fǎng)問(wèn)Y的時(shí)候傳送到站點(diǎn)Y。
在站點(diǎn)Y上,會(huì)有這么一個(gè)目錄,是用來(lái)保存SESSION的實(shí)際數(shù)據(jù)的。站點(diǎn)Y接收到session id,然后通過(guò)session id,來(lái)獲得與SESSION數(shù)據(jù)的關(guān)聯(lián),并返回SESSION數(shù)據(jù)。
可能聰明的你已經(jīng)想到了,既然服務(wù)器端和客戶(hù)端之間的SESSION是通過(guò)一個(gè)SESSION ID來(lái)聯(lián)系,并且SESSION數(shù)據(jù)是以普通文件的形式保存在一個(gè)特定的文件夾里。
那么我們要實(shí)現(xiàn)不同域名,只需要滿(mǎn)足以下兩個(gè)條件:
[color=Red]1)不同域名的SESSION數(shù)據(jù)目錄統(tǒng)一到一起,或者同步更新。
2)對(duì)同一個(gè)客戶(hù),使用統(tǒng)一的一個(gè)SESSION ID [/color]
[color=Green]第一個(gè)條件的實(shí)現(xiàn)。
如果是同一臺(tái)服務(wù)器,就不需要進(jìn)行任何設(shè)置了。
如果是集群/分布式的,那么我想也不需要我來(lái)說(shuō)了。。能做分布式應(yīng)用的,在目錄共享方面的經(jīng)驗(yàn)應(yīng)該比我豐富。我也沒(méi)有進(jìn)行過(guò)多服務(wù)器的測(cè)試,主客觀(guān)條件的原因都有。
我在這里主要是想說(shuō)一下第二個(gè)條件――使不同的域名,擁有統(tǒng)一的SESSION ID。
那我們應(yīng)該怎么統(tǒng)一呢?
首先必須在不同域名之間傳遞這個(gè)SESSION ID,且由于 cookie必須是針對(duì)域名的,所以傳遞動(dòng)作是由客戶(hù)端來(lái)完成。如果傳遞過(guò)程不是由客戶(hù)端來(lái)完成,那么接受傳遞的域名就不知道針對(duì)的是哪個(gè)客戶(hù)。
其次就是修改接受傳遞的域名下的SESSION ID。[/color]
---------------------
- 1 回答
- 0 關(guān)注
- 1485 瀏覽
添加回答
舉報(bào)