我是PHP的新手,我曾经开发过一个小的网络应用程序。在我的设计中,我依靠一个我最初认为易于使用的功能,但我越深入,我就越意识到这可能是一个相当基本的问题。
设置如下:
-
我有数据块,我们称之为data_1,...,data_n
-
对于任何 i,data_i可能无法访问
-
当用户连接时,他会获取第一个可用的大量数据并将其标记为无法访问
-
当用户停止工作时,数据将再次可访问
-
没有登录名,会话ID用于用户识别
-
数据存储在 MySQL 数据库中
现在,我已经以这样一种方式实现了它,即在请求中,用户使用数据锁定表,找到第一个可用的表,设置标记并解锁表。
问题是当用户不删除标记时 - 默认情况下,我需要在某个时候再次提供数据。
我尝试了JS,但是Window.onbeforeunload不能保证运行(例如在崩溃时)。
我尝试运行一个可以轮询连接的 PHP 脚本。但是我需要在两者之间执行其他脚本,我明白这是不可能的,因为当时只有一个脚本可以访问会话数据,因此轮询脚本会阻止执行其他脚本。
我已经通过保存每次通信的时间戳来解决,这些数据是用户独占访问权限的(并添加在窗口打开时建立连接的脚本以防止超时)。如果有新用户来,他会检查时间戳,如果有足够长的暂停时间,他会获取数据并存储他的时间戳。
然而,我的解决方案是一种解决方法,并不能真正解决问题。谷歌搜索显示,每个人都在询问连接丢失后如何保持执行的问题 - 但这不仅仅是这种情况,因为对我来说,连接丢失时没有执行。
问题是:使用 PHP 5.4,如何创建在连接丢失后执行的脚本?
谢谢。
- 您需要使用套接字。
- https://code.google.com/p/jquery-websocket/
2.查看"示例 #1 A ignore_user_abort() 示例"
- http://php.net/manual/en/function.ignore-user-abort.php
用这种方式做到这一点。
- 相关您session_ids以及您正在为具有该seesion_id的用户锁定的数据。
2.当用户在您的网页上启动时,您可以将他/她的会话 ID ( session_id()
) 插入具有当前时间戳的数据库中。
每 20 分钟(使用 cron 作业)或在每个页面请求上检查数据库表,查找过去 20 分钟内处于活动状态的 seesion ID 列表。
获取该列表并锁定该会话 ID,并在session_ids的其余部分解锁关联的表。