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

Php 快速单击链接会导致注销(会话锁定?),php,session,cakephp,locking,cakephp-3.x,Php,Session,Cakephp,Locking,Cakephp 3.x,问题: 登录时,我快速单击以在新选项卡中打开多个链接,第一个链接工作正常,但后面的链接无法从会话中读取用户,并导致应用程序认为“没有用户数据=没有访问权限,重定向到登录” 我被告知这可能是由于PHP的会话锁定。这样做的目的是加载第一个页面,这样做就是阅读会话。在完成之前,下一个用户正在尝试读取会话,但它仍然被第一个用户锁定 如果您只需单击一个链接,然后单击另一个链接,也会发生这种情况。因为第一个链接仍然会命中服务器,导致它锁定会话,所以当浏览器尝试将您转到第二个链接时,它无法读取用户,并认为您未

问题:

登录时,我快速单击以在新选项卡中打开多个链接,第一个链接工作正常,但后面的链接无法从会话中读取
用户
,并导致应用程序认为“没有用户数据=没有访问权限,重定向到登录”

我被告知这可能是由于PHP的会话锁定。这样做的目的是加载第一个页面,这样做就是阅读会话。在完成之前,下一个用户正在尝试读取会话,但它仍然被第一个用户锁定

如果您只需单击一个链接,然后单击另一个链接,也会发生这种情况。因为第一个链接仍然会命中服务器,导致它锁定会话,所以当浏览器尝试将您转到第二个链接时,它无法读取
用户
,并认为您未登录

这似乎是一个非常奇怪的默认行为,我不得不想象有人想出了一个体面的解决方案,而不是“不要打开多个标签”和“点击链接时不要改变主意”

这不会发生在我的CakePHP2.xPHP5.x应用程序上,而是发生在我的CakePHP3.xPHP7.x应用程序上

一个建议的解决方案:

有人叫我试试Redis。虽然这听起来是一个不错的解决方案(Redis不会锁定会话),但它删除了会话,而且似乎也不起作用。即使将CakePHP 3应用程序设置为使用redis进行会话,并验证其是否正在将会话数据写入redis,问题仍然存在

问题:

处理这个问题的标准方法是什么?默认情况下,每个CakePHP 3.x应用程序都有这个bug吗

注意/附加小问题:


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

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

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


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

您似乎发现了一些问题。似乎每次单击链接时都会续订会话。仍然在探究原因。原来我在做一个
$this->Auth->setUser($user)。谢谢你给我指明了那个方向!