現在很多分類資訊網站都會分出很多個次層網域出來,比如:sh.ganji.com(上海趕集網), su.ganji.com(蘇州趕集網)等等,像這種擁有多個次層網域的網站,該如何?同步共用session呢,這裡不討論在多個伺服器上的問題,僅僅分享一下在同一個伺服器上面的多個次層網域網站如何共用session。
說這個問題之前,先來瞭解一下 PHP SESSION 的工作原理。在用戶端(如瀏覽器)登入網站時,被訪問的 PHP 頁面可以使用 session_start() 開啟 SESSION,這樣就會產生用戶端的唯一標識 SESSION ID(此 ID 可通過函數 session_id() 擷取/設定)。SESSION ID 可以通過兩種方式保留在用戶端,使得請求不同的頁面時,PHP 程式可以獲知用戶端的 SESSION ID;一種是將 SESSION ID 自動加入到 GET 的 URL 中,或者 POST 的表單中,預設情況下,變數名為 PHPSESSID;另一種是通過 COOKIE,將 SESSION ID 儲存在 COOKIE 中,預設情況下,這個 COOKIE 的名字為 PHPSESSID。這裡我們主要以 COOKIE 方式進行說明,因為應用比較廣泛。
SESSION 的資料是儲存在伺服器端的檔案或資料庫中。預設情況下,php.ini 中設定的 SESSION 儲存方式是 files(session.save_handler=files),即使用讀寫檔案的方式儲存 SESSION 資料,而 SESSION 檔案儲存的目錄由 session.save_path 指定,檔案名稱以 sess_ 為首碼,後跟 SESSION ID,如:sess_c72665af28a8b14c0fe11afe3b59b51b。檔案中的資料即是序列化之後的 SESSION 資料了。如果訪問量大,可能產生的 SESSION 檔案會比較多,這時可以設定分級目錄進行 SESSION 檔案的儲存,效率會提高很多,設定方法為:session.save_path=”N;/save_path”,N 為分級的級數,save_path 為開始目錄。當寫入 SESSION 資料的時候,PHP 會擷取到用戶端的 SESSION_ID,然後根據這個 SESSION ID 到指定的 SESSION 檔案儲存目錄中找到相應的 SESSION 檔案,不存在則建立之,最後將資料序列化之後寫入檔案。讀取 SESSION 資料是也是類似的操作流程,對讀出來的資料需要進行解序列化,產生相應的 SESSION 變數。
通過瞭解php session的工作原理,這裡我們就可以有兩種方法解決session共用的問題了。
(1)利用COOKIE存放session_id();
網域名稱一檔案php代碼:
<?phpsession_start();setcookie("session_id",session_id(),time()+3600*24*365*10,"/",".Alixixi.com");$_SESSION['user_name']='hello';echo $_SESSION['user_name'];?>
網域名稱二檔案php代碼:
<?phpsession_destroy(); session_id($_COOKIE['session_id']);session_start();echo $_SESSION['user_name'];?>
(2)利用php.ini 的session.cookie_domain
備忘:這裡是用php代碼實現不需要修改php.ini的設定檔;如果有需要你可以在php.ini裡面修改設定檔(該情況下就不需要改段代碼:ini_set("session.cookie_domain",'session.com');)
網域名稱一檔案php代碼:
<?phpini_set("session.cookie_domain",'Alixixi.com');//註:該參數必須在sesson_start()之上,否則將不會生效session_start();$_SESSION['user_name']='梁山良民';echo $_SESSION['user_name'];?>
網域名稱二檔案php代碼:
<?phpini_set("session.cookie_domain",'Alixixi.com');session_start();echo $_SESSION['user_name'];?>
下面是兩個需要注意的問題:
一:ini_set("session.cookie_domain",'session.com');必須放在session_start()之前;
二:在某些網站測試的時候必須得注意,或許你本地沒有問題,但是在其他機器上或者伺服器上有問題,那麼你需要檢查ini_set("session.cookie_domain",'session.com');這個中的session.com中必須與你的網域名稱 進行真實匹配!不然你的部分session值將會出現問題的!
您可能感興趣的文章
- APACHE同一IP配置多個網域名稱,Apache下同一個IP配置多個虛擬機器主機
- smarty模板中使用php函數以及smarty模板中如何對一個變數使用多個函數
- 如何查看同一伺服器上掛有多少個網站
- 大流量網站該如何?最佳化伺服器、靜態化、資料庫最佳化、負載平衡以實現高負載
- mysql伺服器主從資料庫同步配置
- CuteFTP串連ftp伺服器時彈出“遇到無效的參數”錯誤的解決辦法
- 如何增強Linux和Unix伺服器系統安全性
- 總結MySQL資料庫伺服器逐漸層慢的原因和解決辦法