何时连接在PHP中丢失时执行脚本

时间:2013-10-17 13:42:33

标签: php mysql ajax timeout connection-pooling

我是PHP的新手,我曾经开发过一个小型的网络应用程序。在我的设计中,我依靠一个我最初认为易于使用的功能,但是我越深入了解我可能认为它可能是一个相当基本的问题。

设置如下:

  • 我有数据块,我们称之为data_1,...,data_n

  • 对于任何i,data_i可能无法访问

  • 当用户连接时,他获得了第一个可用的大量数据,并将其标记为无法访问

  • 当用户停止工作时,数据可以再次访问

  • 没有登录,会话ID用于用户识别

  • 数据存储在MySQL数据库

现在,我已经以这样的方式实现它:在请求中,用户使用数据锁定表,找到第一个可用的,设置标记并解锁表。

问题是当用户没有删除标记时 - 我需要在默认情况下再次使数据可用。

我试过JS,但不保证Window.onbeforeunload运行(例如在崩溃时)。

我尝试运行一个可以轮询连接的PHP脚本。但我需要在两者之间执行其他的脚本,并且我理解这是不可能的,因为当时只有一个脚本可以访问会话数据,因此轮询脚本会阻止其他脚本的执行。

我已经通过使用用户可以独占访问的数据保存每次通信的时间戳来解决问题(并添加在窗口打开时建立连接的脚本以防止超时)。如果新用户来了,他会检查时间戳,如果有足够长的暂停,他会获取数据并存储他的时间戳。

我的解决方案是一种解决方法,并没有真正解决问题。谷歌搜索显示每个人都在询问在连接丢失后如何保持执行的问题 - 但这不是纯粹的情况,因为对我来说,在连接丢失时没有执行。

问题是:如何使用PHP 5.4创建一个在连接丢失后执行的脚本?

感谢。

2 个答案:

答案 0 :(得分:0)

  1. 你需要使用套接字。
  2. 2.查看“示例#1 ignore_user_abort()示例”

答案 1 :(得分:0)

你可以这样做。

  1. 与您相关的session_ids&您为具有该seesion_id的用户锁定的数据。
  2. 2.当用户在您的网页上启动时,您可以使用当前时间戳在数据库中插入他/她的会话ID(session_id())。

    每20分钟(使用一个cron作业)或每个页面请求检查数据库表,查看过去20分钟内活动的seeion ID列表。

    获取该列表&保持对该会话ID的锁定,并解锁其余session_ids的关联表。