在 PHP 中跨服务器传输会话

Posted

技术标签:

【中文标题】在 PHP 中跨服务器传输会话【英文标题】:Transfer session across server in PHP 【发布时间】:2011-05-24 14:29:31 【问题描述】:

我需要跨服务器传输用户会话。 IE。如果用户登录 server1 并且用户存在于 server2 中,那么我必须将用户会话详细信息传输到 server2。为此,我使用了以下技术

从server1,将用户重定向到http://server2/auth_from_server1.php?sessionid=12345 在 server2 上(在内部,在 auth_from_server1.php 的 PHP 代码中),使用 sessionid 12345 向http://server1/secret/check_session_id.php 发出请求。 在server1上,在check_session_id.php的实现中,验证ID并返回OK、FAILURE,以及你想传递的会话相关数据,如用户名、... 在 server2 上,当调用返回 OK 时,存储传输的会话数据,并为用户提供该服务器的 cookie 和会话。

但是当回调函数调用 auth_from_server1.php 时,会话 id 中的值为空。我试图检查 sessionid 为

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

但是 $_SESSION['sessionId'] 为空。在登录页面中,我将会话 ID 的值设置为

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

提前谢谢....

【问题讨论】:

重复***.com/questions/6490875/… 【参考方案1】:

将会话数据存储在共享目录中不是更容易吗?

您也可以在数据库中store it。

【讨论】:

【参考方案2】:

当服务器 2 调用 server1/secret/check_session_id.php 时,它必须提交会话 ID,如 server1/secret/check_session_id.php?sessionid=12345 并且在 check_session_id.php 中,您必须在 session_start() 之前调用 session_id($_GET['sessionid'])

【讨论】:

【参考方案3】:

我建议编写自定义 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

【讨论】:

【参考方案4】:

另一个机会可能是共享文件系统。 由于 PHP 将会话放在文件系统中,您可以在两台服务器上共享文件系统(例如 sshfs)。

php.ini中改变目标目录的设置是

session.save_path

【讨论】:

跨多个服务器的共享文件系统的准确性是否足够快?我所知道的大多数共享文件系统都是为了“最终一致性”而不是立即一致性【参考方案5】:

我认为在数据库中存储用户的 id 是最合适的方式。这是一种防错方式。

干杯

【讨论】:

【参考方案6】:

当您开始为问题添加越来越多的服务器时,此问题很快就会得到解决。我发现的最佳解决方案之一是将会话存储在数据库中并与服务器共享该数据库。 Redis 通常对此非常有效。这是get started with redis的精彩指南

【讨论】:

请注意,将会话存储在数据库中会占用更多的 CPU 资源,并且如果您的流量很大,可能会很快使服务器陷入瘫痪。

以上是关于在 PHP 中跨服务器传输会话的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 3 中跨多个子域删除会话 Cookie

如何在 ASP.NET 中跨多个 Web 应用程序维护相同的会话 ID

如何在微服务中跨服务执行验证

在 Subversion 中跨分支合并并不是添加所有新文件。为啥不?

如何在 PHPUnit 中跨多个测试模拟测试 Web 服务?

如何在php中跨线程共享全局变量?