PHP代码在用户中止后不能停止,它会一直运行直到脚本完成


php code canot stop after user abort, it runs until the script is completed

我正在用php写一个网站,有一部分代码需要大量的时间来执行。

由于我没有使用线程,当我运行该代码时,整个服务器被它阻塞。但是没关系。

然而,即使我关闭了那个网页,它仍然执行并阻塞了我的服务器。我不能访问我的网站的任何页面,直到过程完成。

由于执行时间很长,所以我为它设置了一个很长的set_time_limit(),但我没有设置ignore_user_abort,所以我假设它不应该在用户中止后运行。还是因为curl的问题(代码做了很多curl的工作)?

谁能告诉我,为什么php脚本不能停止当用户关闭连接?或者有某种方法可以确保在用户中止时脚本可以停止?

谢谢。

关闭浏览器并没有告诉服务器停止做某事。它不告诉服务器任何

长时间运行的进程不属于web应用程序。通常,您需要一些后台任务来处理该过程。web应用程序要么生成此任务(这似乎是一种可行的方法),要么以某种方式将此任务的处理排队,以便后台工作人员可以看到该队列(例如守护进程每X分钟轮询一次的数据库表)。

目标是在任务运行时不阻塞UI。即使用户让浏览器保持打开状态,浏览器本身也可能在一段时间后"放弃",或者在等待太长时间时,其他东西可能会切断用户体验。让用户调用流程,但将流程的调用与流程的执行分开,以便用户可以返回到应用程序界面。

来自PHP手册:

PHP将不会检测到用户已经中止连接,直到一个尝试向客户端发送信息。

因此,即使使用ignore user abort,您也必须尝试在脚本中再次与客户端交互,以确保它正确终止。请注意,在相关页面上有一些关于什么是"发送信息"的附加说明(例如,Echo本身显然不符合条件)。

进一步阅读:http://php.net/manual/en/function.ignore-user-abort.php