PHP/MySQL锁定页面和客户端崩溃

PHP/MySQL锁定页面和客户端崩溃,php,mysql,crash,deadlock,onunload,Php,Mysql,Crash,Deadlock,Onunload,我有一个简单的PHP/MySQL网站。其中有一个页面,一次只能由一个用户访问: 如果一个用户访问此页面,而页面上没有其他用户,则显示该页面 如果一个用户访问此页面,而其他人已经看到它,则该页面将被视为“锁定”,用户将被定向到另一个页面 为了跟踪谁正在访问此页面,我有一个MYSQL表,其结构如下: ________________________________________ | ID | ID_User | Visit_TS | |____|_________|_

我有一个简单的PHP/MySQL网站。其中有一个页面,一次只能由一个用户访问:

  • 如果一个用户访问此页面,而页面上没有其他用户,则显示该页面
  • 如果一个用户访问此页面,而其他人已经看到它,则该页面将被视为“锁定”,用户将被定向到另一个页面
为了跟踪谁正在访问此页面,我有一个MYSQL表,其结构如下:

________________________________________
| ID | ID_User | Visit_TS              |
|____|_________|_______________________|
| 1  |    20   | 2015-01-12 10:00:01   |
|____|_________|_______________________|
在这种情况下,用户ID 20当前正在访问该页面。如果任何其他用户试图访问它,他们不能,因为用户20正在锁定它

如果用户(ID为20)

  • 访问另一页或
  • 关闭浏览器(窗口卸载时使用ajax)
然后,该表被重置

但是,如果用户的客户端计算机崩溃,或者他们进行了强制关闭,则锁永远不会释放(在这种情况下,用户没有访问另一个页面,窗口也没有卸载…)

在这种情况下,我遇到了僵局

从理论上讲,我们必须等到用户重新联机并访问另一个页面或关闭浏览器,但这不是解决问题的方法

我如何解决这个问题


我是否应该创建一个自动PHP脚本,定期重置表?

您可以使用类似ajax的方法检查用户是否仍然可用,比如每10秒检查一次。现在,我正在尝试一些类似于为什么需要此功能的方法?我目前正在研究几种替代方法。。。通过Heartbeat,应用程序将让客户端向服务器发送常规ping(通过ajax或类似的方式)。如果客户端停止发送ping,很可能是因为他已终止会话或崩溃