Yii 应用程序中的重复或交叉会话


Duplicate or Crossover Sessions in Yii application?

我知道像PHP会话ID重复这样的讨论?和php会话ID有多独特,但我提出了一个问题,它似乎像重复会话一样,无法弄清楚可能导致它的原因。

在 PHP 5.5 上运行一个 Yii 1.1 应用程序,该设置包括两个 Apache Web 服务器、负载平衡 (BigIp) 和两个用于用户数据缓存和会话处理的 Memcache 服务器。平均流量为每天登录该应用程序的访问者约为10,000。

负载均衡器

故障转移后报告了第一个事件。但是,从那时起,MySQL上已经有一个会话日志记录机制实现,以便跟踪每个登录用户的生成会话,并防止其他用户使用先前生成的会话登录的情况。

如果捕获了重复的会话,则会注销用户并重新生成会话。

到目前为止的结果表明,几乎每天都至少有一两个用户获得了重复会话的情况,因此实施的机制开始解决它。

尽管强烈建议在应用程序的生命周期中极不可能遇到此类事件,但我仍然监视日志,表明正在发生一些奇怪的事情。我可以使用一些关于可能导致问题的建议。

我认为可能以某种方式连接的另一个问题是,尽管一个人的会话在 10 分钟没有活动后过期,但经常注意到用户会在 3 分钟内登录 10-4 次,在我看来,这似乎表明 memcache 随机丢失会话。

安装程序不使用粘性会话,这意味着每个用户请求都通过服务器 1 或服务器 2 随机提供。

看起来是不是像

  1. 资源设置问题?(Apache,BigIP等?
  2. 应用程序问题?一遍又一遍地生成相同的会话?
  3. 内存缓存问题?
  4. 别的?

正在进行一些进一步的搜索,我遇到了这个术语,我认为它更适合我所描述的:"会话交叉"。

问题是通用给出具体的答案,尝试通过检查系统和改变事物来获取更多信息。

很明显,如果您不使用粘性会话,则必须共享您的会话存储,也许 memcache 正在运行两次?

尝试粘性会话,看看它是否有所作为。

尝试其他会话存储,例如 tempfs 中的文件以及粘性会话。

检查会话ID的随机性,也许随机生成器是通过设置相同的种子来欺骗的。有时切换 php 的执行方式会有所帮助 modphp->fcgi

祝你好运

好吧,只是实际思考。会话数据存储在文件中。只要此会话文件存在,会话就处于活动状态。因此,您可以确定是否正在使用特定的会话 ID。

所以你能做的是:

  1. 使用 uniqid() 创建唯一的会话 ID;
  2. 检查是否存在具有此唯一 ID 的会话文件,如果是,则通过 uniqid() 创建另一个 ID,如果没有,则找到可用的会话 ID;
  3. 通过session_id($uniqueId)创建会话。

警告,这是一种实用的方法,我希望 PHP 不应该获得重复的会话 ID,在这种情况下,应该作为要修复的错误报告给 PHP 项目。

您的内存缓存服务器是如何连接的?它们都用于阅读和写作吗?通过什么策略?

我也从 Redis 那里知道它在内存不足时(随机)丢弃密钥,也许 memcache 也有类似的东西?