情况如下:
我有一个基于 Web 的票务应用程序,有多个用户。
可能发生的一个问题(并且确实发生在我要替换的旧版本中)是 user1 打开一张票,编辑它,然后保存它。但是在他编辑它的同时,user2 也打开并保存了勾选。user2 所做的更改将被 user1 丢失/覆盖。
为了防止这种情况,我实现了一个锁定机制,它相当简单:
- 在打开票证时,PHP 脚本会检查现有的锁。
- 如果没有找到,它会锁定并打开文档。
- 在 JS 中,
setTimeout()
一个 XmlHttpRequest 调用会在 10 分钟后解锁票证(工作无问题)。 - 我还设置了一个
unload
事件以在关闭/离开窗口/选项卡时解锁票
问题出在第 4 步:unload
事件(& 它的朋友beforeunload
)工作得不够好,无法可靠地实现这一点(要使这个特性有任何严肃的意义,它必须是可靠的),许多浏览器并不总是触发它当我希望它被解雇时(比如按下后退按钮、按 F5、关闭选项卡等。这因浏览器而异)
我能想出的唯一选择是使用setTimeout()
并XmlHttpRequest()
调用 php 脚本来告诉它页面仍然打开。如果这个“心跳”监视器失败,我们假设用户离开票证并解锁文档。
这对我来说似乎非常低效,并且很快就会导致对服务器的许多请求,甚至只有几个用户。
有人对如何处理这个问题有更好的想法吗?
它需要在 IE8+ 和其他现代浏览器(理想情况下,Firefox、Webkit、Opera)中工作。我不关心 IE6/IE7,我们的组织不使用这些)。