我有 2 台服务器可用于故障转移。数据库作为 Master-Master 复制(MySQL),这样,每个服务器都运行一个完整堆栈的副本。当我在一台服务器上时,我看到会话表得到更新,并且在检查请求后,我看到发送了相同的 PHPSESSID。但是,当我更改 URL 或故障转移到辅助计算机时,我的会话被终止,我必须重新登录。
在辅助服务器上发送相同的 PHPSESSID 值,但无法识别会话。Apache/PHP 是否将会话链接到该特定框?如果是这样,我怎样才能让他们识别数据库中已经存在的会话?
我有 2 台服务器可用于故障转移。数据库作为 Master-Master 复制(MySQL),这样,每个服务器都运行一个完整堆栈的副本。当我在一台服务器上时,我看到会话表得到更新,并且在检查请求后,我看到发送了相同的 PHPSESSID。但是,当我更改 URL 或故障转移到辅助计算机时,我的会话被终止,我必须重新登录。
在辅助服务器上发送相同的 PHPSESSID 值,但无法识别会话。Apache/PHP 是否将会话链接到该特定框?如果是这样,我怎样才能让他们识别数据库中已经存在的会话?
注意:从“编辑”移至答案以标记为已回答
确实找到了解决办法。“问题”是用于保护 PHP 安装的 Suhosin 补丁。Suhosin 支持基于加密密钥以及应用程序的 DocRoot 加密会话数据的可配置选项,因为故障转移服务器具有不同的 DocRoot,因此不可能读取加密数据。
我编辑了 suhosin.ini 以添加共享密钥,并关闭了 DocRoot 加密选项,会话按预期共享。
解决方案:http ://rommelsantor.com/clog/2011/02/06/php-shared-session-encoding-solution/
如果您正在使用$_SESSION
,那么这与该服务器有关。您应该使用 cookie 来跟踪会话 ID,然后将其与数据库中的会话进行匹配。