2017-06-13 92 views
0

PHP會話變量不能跨服務器傳輸。這是一個簡單的例子,我正在使用它來檢查它是否工作。請看一下。PHP會話不能跨服務器工作

file1.php

<?php 
    session_start(); 

    $_SESSION['FirstName'] = Kshitij ; 
    $_SESSION['LastName'] = Kawatra ; 
    echo session_id(); 
    echo "<p>First Name is: " . $_SESSION['FirstName'] . "</p>" ; 
    echo "<p>Last Name is: " . $_SESSION['LastName'] . "</p>" ; 
?> 
<p>Go to the <a href="https://<server-ip>/file2.php">next page</a>.</p> 

file2.php(在不同的服務器上)

<?php 
    session_start(); 
    echo session_id(); 
    echo "<p>The FirstName session variable is: " . $_SESSION['FirstName'] . "</p>"; 
    echo "<p>The LastName session variable is: " . $_SESSION['LastName']. "</p> "; 
?> 

即使會話ID不匹配。

+2

您是如何將服務器連接在一起以便會話正常工作的?它們是在負載均衡器之後還是在不同的主機名之後?默認情況下,會話不能以任何方式在服務器之間傳輸。 –

+0

你想在這種情況下使用會話? –

+0

@sami服務器有兩個不同的主機名。我想將會話變量存儲在數據庫中,但我不確定如何從數據庫中檢索數據。 – kkawatra

回答

2

默認情況下,會話不會在主機或服務器之間傳輸。如果您使用Cookie來處理會話,則Cookie僅會發送到始發服務器(簡化版)。如果您轉移到另一臺主機/ IP,瀏覽器自然不會將其他主機的任何cookie發送到該網站。如果他們確實每個人都可以得到你所有的賬戶和登錄並濫用它們。

如果你想在服務器之間傳輸會話,你必須以某種方式連接它們。如果它們完全分離,則可以將URL中的令牌發送到第二臺服務器,然後可以使用它從第一臺服務器檢索必要的信息。您使用的系統取決於您實際嘗試實現的目標。

+0

雖然這是一個不錯的選擇,但我不認爲它很安全。 – kkawatra

+0

@kkawatra它可以變得安全。這就是多少驗證/ SSO系統工作。這都是關於你如何處理令牌生成和數據傳輸。 –

+0

你介意分享一些你認爲最有效和最安全的例子嗎? – kkawatra

2

首先,這是不可能的默認會話行爲http://php.net/manual/en/session.examples.basic.php

你可以使用默認的另一個會話處理程序session_set_save_handlermemcached

+0

如果我錯了,請糾正我。如果我使用會話處理程序並將會話數據從server1保存到數據庫。現在,如果我希望使用server2的會話處理程序檢索該數據,我將需要會話ID或來自server1的一些數據來過濾查詢。如果是這樣的話,我將不得不以其他方式在兩臺服務器之間傳輸會話ID,對吧? – kkawatra

+0

@kkawatra是的,你需要會話名稱或ID –

+0

那麼你認爲傳輸會話名稱或ID的最佳方式是什麼? – kkawatra

2

有服務器之間進行通信的方式,但Session是不是一個。 PHP會話實際上是一個內存空間,其會話的壽命可以通過不同的可能方式刷新,而這個內存僅僅是服務器端,只有運行PHP代碼的服務器。

最好的方法,但最難的是在這兩個服務器之間創建一個套接字,並通過這兩個服務器之間的安全層進行通信。

http://php.net/manual/en/function.socket-create.php

最簡單的方法是創建一個REST API,並通過它與HTML查詢字符串JSON輸出來進行通信。

Returning JSON from a PHP Script