PHP跨子域在不同服务器上的子域会话

时间:2011-12-15 09:01:25

标签: php session cross-domain cross-server

我有3个域名:

  1. member.example.com,用于在SERVER1上登录集中器
  2. news.example.com获取有关SERVER1的新闻
  3. video.example.com,用于另一台服务器SERVER2上的视频
  4. 对于我正在使用的跨子域会话:

    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来解决这个问题,但它没有用。

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

2 个答案:

答案 0 :(得分: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']);

尝试它是否有效。

答案 1 :(得分:0)

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

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

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

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

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