2012-10-05 91 views
2

我有一个页面,用户可以启动后台进程。如果用户刷新页面或关闭标签或浏览器,我想停止此过程。试过connection_abort(),但没有运气,剧本刚刚开始运行。 任何想法?停止一个PHP后台进程

+0

'websockets'可以做到这一点 – Baba

回答

0

我觉得你运气不好。 http是一个无状态的协议,只要您的页面处于连接关闭状态。

除了一些AJAX技巧,没有办法告诉用户刷新或关闭浏览器。

+0

想到了,无论如何感谢 – slash197

0

如果您对用户的唯一标识符,这样就可以追平或进程ID一起存储,以下逻辑可以工作:

  1. 用户请求页面
  2. 用户被赋予一个唯一的id
  3. 后台进程启动并且它的id与用户标识一起被登录到数据库
  4. 进程不断检查数据库 - 以选定的频率 - 检查数据库中的记录,如果它不存在或者不像预期的那样,该过程自行停止。
  5. 然后,你必须为用户无论前端既可以:
    • 触发脚本(即stop_process.php用户= ID?)通过AJAX时,它需要 - 即当页面导航离开。由于onbeforeunload阻止或停止某些浏览器中的Ajax请求,因此此方法可能不可靠。
    • 有一个ajax轮询脚本,不断更新带有时间戳的数据库中的流程记录,如果这个戳记过期 - 意味着用户已经导航或停止了js - 那么过程停止。

以上是一个相当复杂的解决方案(也可能气质,因为它依赖于JavaScript)所以也许应该只有在真正需要或认为如果目标观众可以被锁定。

作为非js解决方案,您可以依赖轮询方法并设置元刷新帧。然而,这可能会让老版本的Internet Explorer用户疯狂地持续“点击”。更不用说这个解决方案相当不雅。