PHP 不同域名之間 cookie 和 session 共享
原文 http://www.tuluobo.com/2015/02/01/229.html
最近一段時間在使用一個開源程序時,需要將我們的主網站與現在這個開源程序的登錄和注冊機制同步,但是我們又不想使兩個網站充分混合,而是相對獨 立,即多個子網站使用同一個賬號可以登錄。又主要想以開源程序的數據庫為主,那么我們自然而然的想到使用SESSION機制,可以保持兩個網站的登陸信息 一致。
SESSION的機制
雖然,我們知道保持和驗證登陸,通常都是使用session,但是,session的具體機制是怎樣的,估計好多人還是不很明白。其實 session一般情況下默認是需要cookie幫助其完成自己的使命。這話怎么說呢?具體查詢php手冊我們可以知道,session是存儲在服務器 端,每一個session都有自己的sessionid,這個sessionid一般是以保存在cookie中傳遞到瀏覽器,保存在客戶端,用戶在一次會 話中會多次將sessionid傳遞到服務器以獲得對應session。這樣才能保證session信息的正確性, 從而保證用戶登錄信息之間的獨立性。
所以,我們想要使用session,我們必定需要開啟cookie,設置cookie,而恰好php中的session機制在內部已經設置了cookie信息,我們使用起來只需要兩句話就可以了。且看:
session_start(); //開啟session $_SESSION['userinfo'] = $user; //將變量的信息存入session
有的人可能會說為什么在某次項目中,我們需要關閉cookie,但是我們也同時使用了session,那么這就要從sessionid說起,剛才 我們說到session是通過它的id在服務器端檢索的,所以這里我們想要取得session,我們就需要知道sessionid,但是cookie被禁 止,那么sessionid怎么獲得?這就需要另外一種方式,客戶端通過http請求傳遞參數,服務端通過此參數可以生成或者取到存在別處的 sessionid,這樣就得到了session信息。
COOKIE的機制
比起session,大家應該相對更了解cookie吧,那么我在這里只說一下我們需要用到的一個屬性,其他的機制大家可以參考php官方文檔。
這個屬性就是cookie域,我們需要設置我們的cookie所作用的范圍,在同一個網站下,一般我們不用單獨設置cookie域,默認就是當前 的主機名稱,這是為了安全考慮的,設置最小范圍域,故沒有將域設置為當前的域名,如果一旦要人為將作用域擴大,那么我們就需要設置cookie域了。在此 次應用中,我們需要同一域名下的字網站共享cookie,那么我們需要將cookie設置為:
setcookie("tuluobo.com",$s,time()+3600*12,'/','tuluobo.net');
如此設置將在全域范圍內使用cookie,使得各子域名之間的session可共用。
引申
通過這次應用,我又想到了一個問題,本次是在同一個服務器下進行的,session保存在同一個位置,那么不同服務器時,子域名之間的共享 session又如何設置?其實session在服務器端的保存方式有三種,一種是文件形式,也是默認形式,一種是內存形式,另一種是數據庫形式。那么, 我們只要能將session保存在兩個服務器都能找到的地方,這個問題就解決了。顯然是以數據庫形式保存在數據庫或者是以文件形式保存在其他可以同時訪問 的存儲空間中,是不是很好實現?
還有一個問題,那就是如果是不同域名之間需要共享session,那么又該如何設置?這個我就不寫了,如果有童孩有好的想法,不妨和博主在下面一起討論。