快速单击链接会导致注销(会话锁定?)

Clicking links quickly causes logout (session locking?)

问题:

登录后,我快速单击以在新选项卡中打开多个 link,第一个工作正常,但之后的无法从会话中读取 user,并让应用程序思考 "no user data = no access, redirect to login".

有人告诉我这可能是由于 PHP 的会话锁定。想法是第一页正在加载,并且通过这样做,正在阅读会话。在它完成之前,下一个正在尝试读取会话,但它仍然被第一个锁定。

如果您只是单击一个 link,然后单击另一个 link,也会发生这种情况。因为第一个 link 仍然访问服务器导致它锁定会话,所以当浏览器试图将您带到第二个时,它无法读取 user 并认为您没有登录.

这似乎是一个非常奇怪的默认行为,我不得不想象除了 "just don't open multiple tabs" 和 "don't change your mind when clicking links".

之外,有人想出了一个不错的解决方案

这不会发生在我的 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 应用程序实际上都有这个错误吗?

注意/附加小问题:

我注意到 Cake 在 "CAKE" 下存储的 cookie 值在大多数页面加载时都会发生变化。该值是会话密钥(减去前缀)。这是否意味着它在每次页面加载时都设置一个新会话?如果是这样,有什么原因吗?

这不是 PHP 中会话锁定的工作方式,锁定的会话会 阻止 脚本执行,直到会话被解锁,它 不会 继续并让您没有会话访问权限或空会话。

如果您在每个请求中都看到一个新的会话 ID,那么 可能 是问题所在(或其症状),即后续请求使用已经无效的会话 ID,那肯定会给您留下一个空会话,即您会被注销。

会话通常很少重新生成,例如在记录 in/out(以避免重放攻击)时,或者在会话超时时。作为起点,检查您的会话 timeout/lifetime 配置 (\Cake\Network\Session::$_lifetime),同时尝试在 \Cake\Network\Session::renew() 中设置断点以检查它是否被意外调用以及从何处调用。