2

我有一个页面,用户可以在其中启动后台进程。如果用户刷新页面或关闭选项卡或浏览器,我想停止此过程。试过connection_abort()但没有运气,脚本继续运行。有任何想法吗?

4

2 回答 2

0

我觉得你运气不好。http是一个无状态协议,一旦你的页面被提供,连接就会关闭。

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

于 2012-10-05T10:28:22.163 回答
0

如果您有用户的唯一标识符,并且可以将其与进程 ID 绑定或存储,则以下逻辑可以工作:

  1. 用户请求页面
  2. 用户被赋予一个唯一的 id
  3. 后台进程启动,它的 id 与用户 id 一起记录到数据库中
  4. 该过程会以选定的频率不断检查数据库,以查看它是否记录在数据库中,如果它不存在或与预期不同,则该过程会自行停止。
  5. 然后,您为用户提供的任何前端都可以:
    • 在需要时通过 ajax 触发脚本(即 stop_process.php?user=id)——即当页面离开时。由于 onbeforeunload 阻止或停止某些浏览器中的 ajax 请求,这种方法可能不可靠。
    • 有一个 ajax 轮询脚本,它使用时间戳不断更新数据库中的进程记录,如果这个时间戳过期 - 意味着用户已经导航离开或停止了 js - 然后进程停止。

以上是一个相当复杂的解决方案(并且可能因为它依赖于 JavaScript,所以可能只在真正需要或目标受众可以被锁定时才考虑。

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

于 2012-10-05T10:51:55.050 回答