2010-08-23 37 views
0

我有一個應用程序坐在機器A(solaris.example.com)上,同一個應用程序坐在機器B(rhodes.example.com)上,這兩臺機器連接到同一個機器上MYSQL數據庫裏面有會話表。PHP:基於MYSQL的會話在不同的機器上共享

我已經實現了我自己的會話處理程序,因此它保存到數據庫而不是將其保存到文件,並且工作正常。

我的問題是,我如何訪問機器B上創建的確切會話ID?

我有我的init腳本這些安裝兩臺機器:

ini_set("session.gc_maxlifetime", "288000"); 
ini_set("session.cookie_lifetime", "288000"); 
ini_set("session.save_handler", "user"); 
session_set_cookie_params(0, "/", ".example.com", false, false); 
session_cache_expire(288000); 

我得到的問題是,機器B保持在表上創建一個新的會話,當我試圖設置會話機器B上的ID使用session_id($_GET["sessId"])它覆蓋機器A創建的值。

問題是,如何告訴機器B使用由機器A創建的會話ID並從表中獲取數據?

我想這將是自動的,因爲我已經叫session_set_cookie_params(0, "/", ".example.com", false, false);

任何幫助將是非常美妙的

+0

如何指定自定義會話保存處理程序? – Gumbo 2010-08-23 12:10:19

+0

http://pastebin.ca/1923277 – gumpi 2010-08-23 12:38:43

+0

您是否按照自己的需要檢查了正在創建的Cookie?你有沒有檢查發送的cookie頭是否與你想要發送的cookie匹配? – Jasper 2010-08-23 12:43:22

回答

0

我會試圖挽救用戶的計算機上的cookie,所以我可以很容易地確定,如果他/她的會話是否存在。當然,如果用戶已經禁用了cookie,這將不起作用。

您可以根據用戶ip/etc存儲某種有意義的數據,然後您可以根據此數據識別用戶。注意:此解決方案僅在您可以準確識別用戶時才起作用。否則,您可以將其他用戶的會話授予當前用戶。

編輯我在SO上發現了一個link,也許它會有所幫助。

0

假設兩臺機器都在客戶端的URI中使用相同的主機名訪問,那麼您的方法沒有明顯的錯誤。應儘可能避免

SESSION_ID($ _GET [ 「sessId」])

use_trans_id。 Cookie值僅存在於$ _REQUEST(取決於request_order ini設置)或$ _COOKIE中。

當然,如果他們在客戶端使用不同的主機名,那麼您需要自己填充會話標識符--PHP可能不會爲你做。

使用cookie是一種更明智的方法,並且可以大大簡化事情。

您應該檢查機器A上創建的會話ID是否真的呈現給機器B(作爲cookie或URL)。如果是這樣,那麼非常不尋常的事情正在發生。

+0

檢查此URL:http://pastebin.ca/1923277 – gumpi 2010-08-23 12:38:13

+0

對不起,沒有時間做免費代碼批評 - 它並沒有回答我建議你解決的問題。 – symcbean 2010-08-24 10:32:26