1

我有 3 个域:

  1. member.example.com 用于 SERVER1 上的集中器登录
  2. news.example.com 获取 SERVER1 上的新闻
  3. video.example.com 用于另一台服务器 SERVER2 上的视频

对于我正在使用的跨子域会话:

session_name('example');
session_set_cookie_params(0, '/', '.example.com');
session_start();

当用户登录 member.example.com 时,所有会话数据都在 news.example.com 上可用,但在 video.example.com 上不可用,因为它位于另一台服务器上。所有子域的会话 id 都相同,但由于它是不同的物理框,会话文件不存在。

当子域托管在不同的物理服务器上时,我正在寻找能够跨子域共享会话的最佳方法。

我知道将数据存储在数据库中的方法,但希望避免这种情况。我也知道我可以在 video.example.com 的 URL 中发送加密的会话信息,但我觉得它很难看,我想创建一个干净的解决方案。

在遍历 cookie 和其他实现之后,我探索了以下场景。

在成功登录后的 members.example.com 中,我尝试通过使用 cURL 调用 video.example.com 上的会话生成页面来为 video.example.com 创建会话。我尝试使用以下代码(并使用 cURL 传递适当的字段):

session_name('example');
session_set_cookie_params(0, '/', '.example.com');
session_start();
$_SESSION['id']=$_POST['id'];
$_SESSION['name']=$_POST['name'];
print_r($_SESSION)

在 cURL 响应中,我发现为会话设置了这些变量,但不幸的是,为 cURL 调用创建了一个新的会话 ID。我试图通过现有的会话 ID 解决这个问题,但它不起作用。

我知道其他选择,但对这种方法特别感兴趣。

4

2 回答 2

1

在两个服务器上,会话 ID、会话名称、cookie 参数和其他会话设置必须相同。session_name()因此,您应该将session_id()其他会话参数和会话数据发送到视频服务器。然后在您创建的视频上

session_name($_POST['name']);
session_set_cookie_params(0, '/', '.example.com');
session_id($_POST['id']);
session_start();
$_SESSION = array_merge($_SESSION, $_POST['session_data']);

试试它是否有效。

于 2011-12-15T09:39:32.920 回答
0

老问题,可能是一个新的/更好的答案。

我们将 AWS 与自动扩展策略一起使用,因此,随着负载的增加,我们会获得更多实例来运行我们的代码。

为了解决跨多个实例的会话问题(它们是负载平衡的),我们使用 memcached。

PHP 可以相对容易地配置为使用 memcached 作为会话存储。

话虽如此,Memcached 可能不是最适合会话的存储,事后看来,磁盘支持的东西(想到 Redis)可能是更好的解决方案。

于 2017-08-21T10:36:14.443 回答