确保脚本在用户中止时退出

Posted

技术标签:

【中文标题】确保脚本在用户中止时退出【英文标题】:Ensuring that script exit on user abort 【发布时间】:2010-11-25 22:54:29 【问题描述】:

我写了一个没有时间限制的脚本,max_execution_time为0

    我应该一直工作到工作结束或用户中止(从浏览器中取消)。 我如何确定当用户从浏览器中止页面加载时脚本被服务器杀死?

    这是否会立即终止脚本或之前调用类的 __destructor?

【问题讨论】:

【参考方案1】:

假设这是由 ajax 调用的,您可以添加一个事件处理程序,用于当用户离开发送 ajax 请求的网页时,该请求由杀死另一个脚本的脚本处理。

这可以通过让脚本在启动时创建一个文件来实现。然后,它每隔一段时间就会检查该文件是否仍然存在。如果是则继续,如果不是则退出。

诀窍是找到文件名。我这样做的方法是给每个页面请求一个唯一的用户 ID。并且在 url (GET) 中使用相同的用户 ID 调用 'worker' 脚本和 'kill' 脚本。

【讨论】:

当用户离开页面时,你不能使用 XMLHttpRequest 可靠地做到这一点:Opera 根本不支持on(before)unload,而且大多数时候浏览器不允许你这样做等待 Ajax 请求结束的代价高昂;它只是中止(a)挂起的连接并退出。 您好,感谢您的回答。但这有点不可靠。没有更可靠的技术吗? 恐怕不行。我知道这种技术非常不可靠。问题是实现这一点。 (我发现它可以工作相当长的时间。通常只用于更改页面,而不用于关闭浏览器)至少可以为您节省一些服务器负载。我同意你不应该依赖这个来结束你的脚本。但是,由于不需要(通常也不会)浏览器发送与关闭网页相关的任何数据,因此这是您能得到的最好的。 其实我只是灵机一动。只需让网页向服务器发出请求,以某种方式更新文件并检查它是否是最近的。如果不只是放弃。不过,这可能是网络和服务器密集型的。如果这是一个走开然后回来的页面,而不是十秒钟的页面,那将是很好的。 (除非您愿意推动它,否则它可能会给您最大 30 秒的准确度)【参考方案2】:

据我了解,当用户终止页面加载时,php 无法停止脚本执行。我假设“中止”是指在页面仍在加载时单击停止或关闭浏览器。

【讨论】:

嗨,是的,我的意思是点击浏览器中的停止按钮。在 Apache 中是可能的(而不是我所知道的 lightspeed)。有“ignore_user_abort”PHP 功能可以禁用此功能,但我希望启用它并确保脚本被杀死(如果之前调用 __destructor 更好)。

以上是关于确保脚本在用户中止时退出的主要内容,如果未能解决你的问题,请参考以下文章

C# 中止线程:此平台不支持线程中止

检测用户中止/导航 websocket

Bash 脚本:如何确保脚本在使用“或”(||) 条件调用的函数中出现任何错误时退出?

如何在集成脚本之前取消/中止 XCode Bot 集成

MSVC2013:如何避免使用错误的预构建脚本中止构建过程(错误 MSB3073: :VCEnd" 退出,代码 -1)

如何在 n 秒内中止 bash 脚本 [重复]