搜尋
首頁php教程PHP开发thinkPHP多域名情況下使用memcache方式共享session資料的實作方法

本文實例講述了thinkPHP多域名情況下使用memcache方式共享session資料的實作方法。分享給大家供大家參考,具體如下:

一、問題起源

稍大一些的網站,通常都會有好幾個伺服器,每個伺服器運行著不同功能的模組,使用不同的二級域名,而一個整體性強的網站,使用者係統是統一的,即一套使用者名稱、密碼在整個網站的各個模組中都是可以登入使用的。各個伺服器共享用戶資料是比較容易實現的,只需要在後端放個資料庫伺服器,各個伺服器透過統一介面對用戶資料存取即可。但還存在一個問題,就是用戶在這個伺服器登入之後,進入另一個伺服器的別的模組時,仍然需要重新登錄,這就是一次登錄,全部通行的問題,映射到技術上,其實就是各個伺服器之間如何實作共享SESSION 資料的問題。

二、PHP 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 _為前綴,後面跟著SESSIONID,如:sess_c72665af28a8b14c0fe11afe3b59b51b。文件中的資料即是序列化之後的 SESSION資料了。如果訪問量大,可能產生的SESSION 檔案會比較多,這時可以設定分級目錄進行SESSION檔案的保存,效率會提高很多,設定方法為:session.save_path=”N;/save_path”,N為分級的級數,save_path 為開始目錄。當寫入SESSION 資料的時候,PHP 會取得到客戶端的SESSION_ID,然後根據這個SESSION ID 到指定的SESSION 文件保存目錄中找到對應的SESSION文件,不存在則創建之,最後將資料序列化之後寫入文件。讀取 SESSION資料是也是類似的操作流程,對讀取的資料需要進行解序列化,產生對應的 SESSION 變數。

三、多伺服器共享SESSION 的主要障礙及解決方案

透過了解SESSION 的工作原理,我們可以發現,在預設情況下,各個伺服器會各自分別對同一個客戶端產生SESSIONID,如對於同一個用戶瀏覽器,A 伺服器產生的SESSION ID 是30de1e9de3192ba6ce2992d27a1b6a0a,而B 伺服器產生的則是c72665af28a8b14c0fe11afe3b59b51b。另外,PHP 的 SESSION資料都是分別保存在本伺服器的檔案系統中。

確定了問題所在之後,就可以著手進行解決了。想要共享SESSION 數據,那就必須實現兩個目標:一個是各個伺服器對同一個客戶端產生的SESSION ID 必須相同,並且可透過同一個COOKIE 進行傳遞,也就是說各個伺服器必須可以讀取同一個名為PHPSESSID的COOKIE;另一個是SESSION 資料的儲存方式/位置必須保證各個伺服器都能夠存取。簡單來說就是多伺服器共享客戶端的SESSION ID,同時還必須共享伺服器端的 SESSION 資料。

第一個目標的實作其實很簡單,只需要對COOKIE 的網域(domain)進行特別設定即可,預設情況下,COOKIE的網域是目前伺服器的網域名稱/IP 位址,而網域不同的話,各伺服器所設定的COOKIE 是不能互相存取的,如www.aaa.com的伺服器是不能讀寫www.bbb.com 伺服器設定的COOKIE的。這裡我們所說的同一網站的伺服器有其特殊性,那就是他們同屬於同一個一級域,如:tieba.xiaoyuan.com 和www.xiaoyuan.com 都屬於域.xiaoyuan.com,那麼我們就可以設定COOKIE 的網域為.xiaoyuan.com,這樣tieba.xiaoyuan.com、www.xiaoyuan.com 等等都可以造訪此COOKIE。 PHP 程式碼中的設定方法如下:

<?php
ini_set(&#39;session.cookie_domain&#39;, &#39;.xiaoyuan.com&#39;);
?>

   

這樣各個伺服器共享相同客戶端 SESSION ID 的目的就達到了。

第二個目標的實現可以使用文件共享方式,有2種方式可以解決,一是用數據庫存session,還有就是試用memcache。這裡用MEMCACHE解決.

我用的是thinkphp框架,已經支援memcache方式訪問session.架好memcache伺服器後,只需要在設定檔裡面設定好memcache的IP和連接埠,然後指定COOKIE_DOMAIN參數就可以了,然後就可以按正常操作session的方式進行操作,這時已經可以多域名共享session了

希望本文所述對大家基於ThinkPHP框架的PHP程序設計有所幫助。

更多thinkPHP多域名情況下使用memcache方式共享session數據的實現方法相關文章請關注PHP中文網!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)