【发布时间】:2016-01-31 06:40:02
【问题描述】:
我需要在多个服务器之间共享 PHP 会话。但是,我不确定如何维护在一台服务器上创建的会话 ID 以及如何将其传递给下一台服务器。
本质上,客户端可以上传文件,但文件发送到哪个服务器取决于哪个服务器没有过载。
例如,在 test.com 上调用 session_start()
一个 AJAX 帖子被发送到 serv1.test.com。当我在 serv1.test.com 上调用 session_start() 时,我希望它提取由 test.com 上的 session_start() 创建的现有会话信息。但是,这似乎不是 PHP 会话的工作方式?
我安装了 Memcached 并在此处遵循本指南:
我有一个 test.com 和 serv1.test.com 配置为使用的集中式内存缓存服务器。但是, session_start() 在每个服务器上创建一个唯一的会话,而不是重复使用同一个会话。如果我将 PHPSESSIONID 发送到每个服务器,那么我可以加载现有会话。
如何完成我想做的事情?我可以将 PHPSESSIONID 作为 AJAX POST 中的变量发送,但这不是安全风险吗?那是用户可以改变的东西......
如何让 serv1.test.com 继续使用 test.com 上的同一会话集?如何将该会话 ID 安全地传递给 serv1.test.com,以便我可以使用 session_id("existingsessionid_from_test.com") 打开现有会话?
【问题讨论】:
-
启用 cookie 的客户端将始终将会话 cookie 发送回服务器。我相信在您的情况下,如果 cookie 参数设置正确,它也会发送到子域。如果您使用集中式会话存储并且您在两台服务器上都正确配置了它,那么您不必做任何花哨的事情(例如,使用 ajax 发布会话 id)。
-
每台服务器都使用 php5-fpm 运行 nginx。 php.ini 文件配置为使用 memcached,并使用 memcached 服务器的 IP 地址作为 session.save_path。每个服务器都将其会话存储在 memcached 服务器上,但来自根域 test.com 的请求和来自 serv1.test.com 的请求不会导致发送相同的 session_id / cookie。我在每台服务器上将 cookie 域配置为 .test.com,但这也没有什么不同。对 test.com/set_session.php 的调用然后对 serv1.test.com/get_session.php 的调用不会返回任何内容 - 会话 ID 不同。
-
test.com 与 serv1.test.com 位于不同的服务器上 --- DNS 配置为将请求发送到正确的服务器。这是否与即使每个服务器使用相同的会话配置,会话 ID 也不同的原因有关?我如何让两台服务器在会话开始时生成相同的 Id,因为它们都将会话保存在同一个 memcached 实例上?
-
您是否将会话 cookie 设置为可用于子域?如果没有可用的,
session_start()将生成新的 id。看到这个[链接]stackoverflow.com/questions/644920/… -
是的,这一次成功了 set session.cookie_domain = ".example.com" --- 会话现在像我想象的那样共享......非常感谢!这让我发疯了!
标签: php session memcached sharing