多个PHPSESSID冲突

时间:2018-08-24 23:35:31

标签: php session

我注意到每天为多个用户分配相同的session_id。我现在使用的是 php 7.2 ,但是回顾用户会话的历史,这种情况自我使用 php 5.4 以来就一直在发生。

我只是使用session_start()的php默认值,没有自定义会话处理程序。

我已经了解到session_id是客户端IP和时间的组合,但是我使用的负载均衡器可能限制了ip_addresses的随机性?

使用负载均衡器时,增加session_ids唯一性以防止冲突的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

如果您使用的是Nginx,则可能需要检查是否启用了FastCGI微缓存并禁用了它。这导致了一些错误,然后在运行nginx的PHP 7.1中的PHP.net开发人员错误列表中指出

  

错误#75496会话ID冲突发生了几次

     

在第一种情况(发生冲突)之后,我们更改了php.ini中的哈希熵php设置,因此session_id现在为48个字符,但这无助于防止第二种情况。

解决方案:

  

nginx上的FastCGI微缓存将200个响应与会话cookie一起缓存。   当然,也许它在我们的服务器上被设置为错误,但是它与PHP毫无关系。

请参阅: https://bugs.php.net/bug.php?id=75496

答案 1 :(得分:0)

假设您在每个Web节点上都运行PHP-FPM,但是我想#2和#3可能也可以将PHP作为Apache插件运行。

您在这里有一些选择:

  1. 使用apache保持LB的Web节点,并使每个节点都指向同一上游PHP-FPM服务器。显然,运行单个PHP-FPM流程的第三个框可能需要更强大,因为它正在处理两个Web节点的PHP解析。
  2. 更改会话存储以指向两个服务器都可以访问的文件位置(可能是NFS或SMB共享)。不知道我是否曾经做过诚实的事,但似乎可行。确实,您的Web文件可能应该已经在NFS / SMB共享上,因此您只能将更改部署到一个位置。
  3. 启动redis服务器,并让两个Web节点的PHP-FPM进程都使用它进行会话。

在大多数情况下,第三是最好的选择。