【问题标题】:PHP Session doesn't work across serversPHP Session 不能跨服务器工作
【发布时间】:2017-11-14 17:14:02
【问题描述】:

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 都不匹配。

【问题讨论】:

  • 您如何将服务器连接在一起以使会话能够正常工作?它们是在负载均衡器后面还是在不同的主机名上?默认情况下,会话不能以任何方式在服务器之间传输。
  • 在这种情况下你想用什么会话??
  • @sami 服务器有两个不同的主机名。我想将会话变量存储在数据库中,但我不确定如何从数据库中检索数据。

标签: php session server session-variables session-cookies


【解决方案1】:

默认情况下,会话不会在主机或服务器之间传输。如果您使用 cookie 来处理会话,则 cookie 只会发送到原始服务器(简化版本)。如果您移动到另一个主机/IP,浏览器自然不会将任何 cookie 从另一个主机发送到该站点。如果他们这样做,每个人都可以获取您的所有帐户和登录信息并滥用它们。

如果您想在服务器之间传输会话,您必须以某种方式连接它们。如果它们完全分开,您可以例如将 URL 中的令牌发送到第二个服务器,然后它可以使用它从第一个服务器检索必要的信息。您使用的系统取决于您实际想要达到的目标。

【讨论】:

  • @kkawatra 它可以变得安全。这就是有多少身份验证/SSO 系统在工作。这完全取决于您如何处理令牌生成和数据传输。
  • 您介意分享一些您认为最有效和最安全的示例吗?
【解决方案2】:

首先,默认会话行为http://php.net/manual/en/session.examples.basic.php是不可能的

您可以使用另一个会话处理程序 session_set_save_handlermemcached

【讨论】:

  • 如果我错了,请纠正我。如果我使用会话处理程序并将会话数据从 server1 保存到数据库。现在,如果我希望使用 server2 的会话处理程序检索该数据,我将需要来自 server1 的会话 ID 或一些数据来过滤查询。如果是这种情况,我将不得不以其他方式在两台服务器之间传输会话 ID,对吧?
  • @kkawatra 是的,您需要会话名称或 ID
  • 那么您认为传输会话名称或 ID 的最佳方式是什么?
  • 会话名称也更好,如果这个答案对你有帮助,那么接受它会对其他人有帮助。
【解决方案3】:

默认情况下,PHP 会话在一台服务器上是本地的。不能直接在多台服务器上使用。

如果你想这样做,你必须使用另一个会话处理程序。

在此处参考更多详细信息:How to manage a single PHP5 session on multiple apache servers?

【讨论】:

    【解决方案4】:

    服务器之间有多种通信方式,但 Session 不是其中一种。 PHP Session 实际上是一个内存空间,会话的生命周期通过不同的可能方式刷新,并且该内存仅是服务器端,并且仅是运行 PHP 代码的服务器。

    最好的方法,但最难的方法是在这两个服务器之间创建一个套接字,并通过这两个服务器之间的安全层进行通信。

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

    最简单的方法是创建一个 REST API 并通过它与来自 html 查询字符串的 JSON 输出进行通信。

    Returning JSON from a PHP Script

    【讨论】:

      猜你喜欢
      • 2017-12-28
      • 1970-01-01
      • 2015-10-10
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多