【发布时间】:2018-09-12 23:57:29
【问题描述】:
问题:
登录后,我快速单击以在新标签中打开多个链接,第一个工作正常,但后面的无法从会话中读取user,并导致应用程序认为“没有用户数据 = 无法访问,重定向到登录”。
有人告诉我这可能是由于 PHP 的会话锁定。想法是第一页正在加载,并且通过这样做,正在阅读会话。在它完成之前,下一个正在尝试读取会话,但它仍然被第一个锁定。
如果您只是单击一个链接,然后单击另一个链接,也会发生这种情况。因为第一个链接仍然命中服务器导致它锁定会话,所以当浏览器试图将你带到第二个时,它无法读取user并认为你没有登录。
这似乎是一个非常奇怪的默认行为,我不得不想象有人提出了一个不错的解决方案,而不是“不要打开多个标签”和“点击链接时不要改变主意”。
这不会发生在我的 CakePHP 2.x PHP 5.x 应用程序上,但会发生在我的 CakePHP 3.x PHP 7.x 应用程序上。
一个建议的解决方案:
有人告诉我尝试 Redis。虽然这听起来像是一个不错的解决方案(Redis 不会锁定会话),但它删除了 beneficial aspect of session locking 并且似乎也不起作用。即使在将 CakePHP 3 应用程序设置为使用 redis 进行会话,并验证它正在将会话数据写入 redis 之后,问题仍然存在。
问题:
处理这个问题的标准方法是什么?每个 CakePHP 3.x 应用程序是否默认都有这个 bug?
注意/附加小问题:
我注意到 Cake 存储在“CAKE”下的 cookie 值在大多数页面加载时都会发生变化。该值是会话密钥(减去前缀)。这是否意味着它在每次页面加载时都设置一个新会话?如果是这样,有什么原因吗?
【问题讨论】:
标签: php session cakephp locking cakephp-3.x