【问题标题】:PHP: MYSQL-based session sharing on different machinePHP:在不同机器上基于 MYSQL 的会话共享
【发布时间】:2011-04-02 14:42:22
【问题描述】:

我有一个应用程序位于机器 A (solaris.example.com) 上,相同的应用程序位于机器 B (rhodes.example.com) 上,这两台机器连接到同一个 MYSQL 数据库,上面有会话表。

我已经实现了我自己的会话处理程序,所以它保存到数据库而不是保存到文件中,这工作正常。

我的问题是,如何从机器 B 访问在机器 A 上创建的确切会话 ID?

我在两台机器的初始化脚本上都有这些设置:

ini_set("session.gc_maxlifetime", "288000"); 
ini_set("session.cookie_lifetime", "288000");
ini_set("session.save_handler", "user");  
session_set_cookie_params( 0, "/", ".example.com", false, false);
session_cache_expire(288000);

我遇到的问题是机器 B 不断在表上创建一个新会话,当我尝试使用 session_id( $_GET["sessId"] ) 在机器 B 上设置会话 ID 时,它覆盖了机器 A 创建的值。

问题是,我如何告诉机器 B 使用机器 A 创建的会话 ID 并从表中获取数据?

我认为这将是自动的,因为我已经调用了session_set_cookie_params( 0, "/", ".example.com", false, false);

任何帮助都会很棒

【问题讨论】:

  • 如何指定自定义会话保存处理程序?
  • 您是否按照您的需要检查了正在创建的 cookie?您是否检查了发送的 cookie 标头是否与您要发送的 cookie 匹配?
  • 名称 PHPSESSID 值 79c3dfa10e632ec2df7fb9a5240a2aad 主机 .example.com 路径/安全在会话结束时不会过期
  • 所以域是正确的。现在转到 rhodes.example.com 并检查发送的 cookie 标头(例如,通过 Firebug 的网络面板),看看它是否与正确的 cookie 匹配。
  • @El Leonard:example.com 只是实际主机名的占位符,对吧?

标签: php session scalability distributed


【解决方案1】:

我会尝试在用户的机器上保存一个 cookie,以便我可以轻松确定他/她的会话是否存在。当然,如果用户禁用了 cookie,这将不起作用。

您可以根据用户 ip/etc 存储某种有意义的数据,然后您可以根据这些数据识别用户。注意:此解决方案仅在您可以准确识别用户时才有效。否则,您可以将其他用户的会话授予当前用户。

编辑我在 SO 上找到了link,也许它会有所帮助。

【讨论】:

    【解决方案2】:

    假设两台机器都使用客户端 URI 中的相同主机名访问,那么您的方法没有明显错误。

    session_id($_GET["sessId"])

    use_trans_id 应尽可能避免。 Cookie 值仅存在于 $_REQUEST(取决于 request_order ini 设置)或 $_COOKIE 中。

    当然,如果他们在客户端使用不同的主机名,那么您需要自己填充会话 ID - PHP 可能不会为您完成。

    使用 cookie 是一种更为明智的方法,并且可以大大简化事情。

    您应该检查在机器 A 上创建的会话 ID 是否真的呈现给机器 B(作为 cookie 或在 URL 中)。如果是这样,那么正在发生一些非常不寻常的事情。

    【讨论】:

    • 抱歉没有时间进行免费的代码评论——它没有回答我建议你解决的问题。
    猜你喜欢
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 2015-12-16
    • 1970-01-01
    • 2013-08-18
    相关资源
    最近更新 更多