【问题标题】:PHP Replicated Database Sessions FailoverPHP 复制数据库会话故障转移
【发布时间】:2011-04-28 21:28:39
【问题描述】:

我有 2 台服务器可用于故障转移。数据库作为 Master-Master 复制(MySQL),这样,每个服务器都运行一个完整堆栈的副本。当我在一台服务器上时,我看到会话表得到更新,并且在检查请求后,我看到发送了相同的 PHPSESSID。但是,当我更改 URL 或故障转移到辅助计算机时,我的会话被终止,我必须重新登录。

在辅助服务器上发送相同的 PHPSESSID 值,但无法识别会话。 Apache/PHP 是否将会话链接到该特定框?如果是这样,我怎样才能让他们识别数据库中已经存在的会话?

【问题讨论】:

    标签: php mysql session failover high-availability


    【解决方案1】:

    注意:从“编辑”移至答案以标记为已回答

    实际上找到了解决方案。 “问题”是用于保护 PHP 安装的 Suhosin 补丁。 Suhosin 支持基于加密密钥以及应用程序的 DocRoot 加密会话数据的可配置选项,因为故障转移服务器具有不同的 DocRoot,因此不可能读取加密数据。

    我编辑了 suhosin.ini 以添加共享密钥,并关闭了 DocRoot 加密选项,会话按预期共享。

    解决方案来自:http://rommelsantor.com/clog/2011/02/06/php-shared-session-encoding-solution/

    【讨论】:

      【解决方案2】:

      如果您使用的是$_SESSION,那么它与该服务器相关联。您应该使用 cookie 来跟踪会话 ID,然后将其与数据库中的会话进行匹配。

      【讨论】:

      • @drowe:查看这个 PHP 函数:php.net/manual/de/function.session-set-save-handler.php
      • 我正在使用 $_SESSION,并且我在 PHPSESSID 中的 cookie 值与数据库中的 ID 匹配。但是,当 PHP 尝试使用会话数据时,它会失败。它的哪一部分与特定的服务器相关联?我可以覆盖它,以便一台服务器识别来自另一台服务器的会话数据吗?
      • 您应该阅读会话的工作原理。 PHP 中的会话通过 cookie 向客户端提供令牌,然后将数据存储在本地磁盘上的 $_SESSION 中。当客户端再次连接时,它会将会话令牌与存储在磁盘上的数据重新结合。
      • @JohnD - 会话数据不存储在磁盘上,而是存储在被复制的数据库中。 cookie 中的令牌在主服务器和辅助服务器之间正确传递 - 辅助服务器正在从数据库中正确读取会话数据,但随后(我相信)PHP 将其视为无效,并将其清除。
      • PHP 的 $_SESSION 存储在磁盘上。
      猜你喜欢
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 2014-02-21
      相关资源
      最近更新 更多