2017-06-13 32 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