2010-12-13 71 views
8

我需要跨服務器傳輸用戶會話。即。如果用戶登錄server1,並且如果用戶存在於server2中,則必須將用戶會話詳細信息傳輸到server2。爲此,我使用以下技術在PHP中跨服務器傳輸會話

從server1的,重定向用戶http://server2/auth_from_server1.php?sessionid=12345 server2上(在內部,在auth_from_server1.php的PHP代碼),執行的請求http://server1/secret/check_session_id.php與會話ID,12345 在server1上,在check_session_id.php的實現,驗證ID並返回你想傳遞的OK,FAILURE和會話相關數據,如用戶名,... 在服務器2上,當呼叫以OK返回時,存儲傳輸的會話數據,以及爲用戶提供該服務器的cookie和會話。

但是,當回調函數調用auth_from_server1.php時,會話ID中的值爲空。我嘗試檢查會話ID爲

if(isset($_SESSION['sessionId'])) 
echo 'true'; 
else 
echo 'false'; 

但$ _SESSION ['sessionId']爲空。在登錄頁面,我設置爲

$_SESSION['sessionId'] = session_id(); 

預先感謝會話ID值....

+0

重複http://stackoverflow.com/questions/6490875/how-to-manage-a-single-php5-session-on-multiple-apache-servers – Capsule 2015-02-06 00:16:44

回答

16

難道不容易,只需存儲會話數據的共享目錄?

或者您可以在數據庫中使用store it

3

當服務器2級的呼叫服務器1 /祕密/ check_session_id.php它提交會話ID喜歡server1的/祕密/ check_session_id.php?會話ID = 12345和check_session_id.php你有session_start()之前調用session_id($_GET['sessionid'])

7

我會建議編寫一個自定義PHP會話處理程序或使用像ShareDance這樣的預建會話處理程序。您可以將會話信息存儲在兩臺計算機共享的MySQL數據庫中,SQLite文件等。

使用PHP的內置功能通過使用session_set_save_handler()來獲取/設置會話數據有很多好處,即所有從$ _SESSION獲取或設置的調用將在您的應用程序代碼中工作,無需任何額外的修改。

更多信息可以在這裏找到: http://php.net/manual/en/function.session-set-save-handler.php

編寫自定義會話處理程序(舊但仍然相關)的指南是在這裏: http://devzone.zend.com/article/141

3

另一個機會可以共享的文件系統。 由於PHP將會話放入文件系統,因此可以在兩臺服務器上共享文件系統(例如sshfs)。

php.ini改變目標目錄設置爲

session.save_path 
+1

共享文件系統在多臺服務器上的準確性足夠快?我所知道的大多數共享文件系統都是爲「最終一致性」而拍攝的,而不是即時一致性 – 2015-02-12 19:35:25

2

我認爲存儲在數據庫用戶的ID是最合適的方式做this.It是一個錯誤的證明方式。

乾杯

2

這個問題可以很快失控,當你開始添加越來越多的西弗斯的問題。我發現的最佳解決方案之一是將會話存儲在數據庫中並與服務器共享該數據庫。 Redis通常對此很有幫助。這裏是一個偉大的指南get started with redis

+0

請注意,將會話存儲在數據庫中會佔用大量CPU資源,並且如果流量很大,可能會使服務器快速停止運行。 – Vincent 2018-02-24 17:54:44

+0

在這一點上,我們正在談論多個服務器。 – Rick 2018-02-25 22:27:26