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

时间:2018-09-12 23:57:30

标签: php session cakephp locking cakephp-3.x

问题:

登录后,我迅速单击以在新标签页中打开多个链接,第一个标签可以正常工作,但后面的那些标签无法从会话中读取user,并导致应用程序认为“没有用户数据=无法访问,请重定向到登录”。

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

如果您只单击一个链接,然后单击另一个链接,也会发生这种情况。由于第一个链接仍会打到服务器上,从而导致它锁定了会话,因此当浏览器尝试将您带到第二个链接时,它无法读取user并认为您尚未登录。

这似乎是一个非常奇怪的默认行为,我必须想象有人提出了一个不错的解决方案,而不是“只是不要打开多个选项卡”和“在单击链接时不要改变主意”。 / p>

在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应用程序实际上都有此错误吗?

注意/其他次要问题:

我注意到,蛋糕存储在“蛋糕”下的cookie值在大多数页面加载时都会改变。该值是会话密钥(减前缀)。这是否意味着每次加载页面都要设置一个新会话?如果是这样,那有什么原因吗?

1 个答案:

答案 0 :(得分:1)

那不是PHP中会话锁定的工作方式,锁定的会话会阻止脚本执行,直到该会话被解锁为止,它会继续进行,从而使您没有会话访问或会话为空。

如果您在每个请求中看到一个新的会话ID,则可能是 问题(或它的症状),即随后的请求使用已经无效的会话ID,那肯定会离开您会话为空,即您将被注销。

会话通常很少重新生成,例如,在登录/注销(以避免重播攻击)或会话超时时。首先,请检查会话超时/生存期配置(\Cake\Network\Session::$_lifetime),并尝试在\Cake\Network\Session::renew()中设置一个断点,以检查它是否被意外调用以及从何处被调用。