Zend_Session_SaveHandler_DbTable和并发请求

问题描述:

我正在使用Zend_Session_SaveHandler_DbTable在多个机器间共享会话数据。Zend_Session_SaveHandler_DbTable和并发请求

根据以下示例,我遇到了并发请求问题。请求A和B运行在同一时间对同一用户

  1. 请求A - 在用户的会话数据读取
  2. 请求B - 通过添加可变表面处理 - 在用户的会话数据
  3. 请求B读取XYZ到会话并写入会话数据到数据库
  4. 请求A - 表面处理和写入原来的会话值回数据库

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

问题是请求A不锁定会话,它看起来像Zend_Session_SaveHandler_DbTable不支持会话锁定。有没有人有任何关于如何解决这个问题的例子?使用memcached或返回基于文件的会话不是一种选择。

暂时我已经破解了Zend_Session_SaveHandler_DbTable写入方法来比较在读取和写入时的修改日期,如果不同,请不要将会话写回数据库。

您看到的行为与预期相同。 (这并不意味着它不

的默认的基于文件的会话处理器实际上是不断session_startsession_write_close /脚本结束之间的会话文件的独占锁定。这只允许用户的一个请求一次运行。

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

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