繁体   English   中英

Zend_Session_SaveHandler_DbTable和并发请求

[英]Zend_Session_SaveHandler_DbTable and concurrent requests

我目前正在使用Zend_Session_SaveHandler_DbTable在多台计算机之间共享会话数据。

按照下面的示例,我遇到了并发请求的问题。 请求A和B同时针对同一用户运行

  1. 请求A-读取用户的会话数据
  2. 请求B-读取用户的会话数据
  3. 请求B-通过将变量xyz添加到会话中来完成并将会话数据写回到数据库中
  4. 请求A-完成并将原始会话值写回数据库

结果。 我们失去了xyz变量。 请注意,即使请求A尚未更改会话变量,它也会写回数据库。 我认为这是因为它需要更新会话的修改时间。

结果是,请求A不会锁定会话,并且Zend_Session_SaveHandler_DbTable似乎不支持会话锁定。 有没有人有解决此问题的示例? 不能选择使用内存缓存或返回基于文件的会话。

目前,我已经破解了Zend_Session_SaveHandler_DbTable的write方法,以比较读取和写入时的修改日期,如果不相同,请不要将会话写回到数据库中。

您看到的行为是预期的。 (这并不意味着它不会吮吸 。)

默认的基于文件的会话处理程序实际上在session_startsession_write_close /脚本结束之间的会话文件上保留排他锁。 这仅允许用户的请求之一立即运行。

PHP开发人员似乎希望每个自定义会话处理程序独立处理锁定问题。 这不是不合理的,但是这是一个痛苦的过程。

您使用的解决方案可能是安全且理智的。 它也比尝试在SQL中建立锁定更好,因为在脚本异常退出并且无法释放锁定时,这可能会带来麻烦。 您应该考虑充实您的自定义代码以使锁定成为可选,然后将该代码提交给Zend Framework项目,以便其他人受益。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM