【问题标题】:php code canot stop after user abort, it runs until the script is completed用户中止后php代码无法停止,它一直运行到脚本完成
【发布时间】:2015-07-13 12:54:34
【问题描述】:

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

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

但是,即使我关闭了该网页,它仍然会执行并阻止我的服务器。在该过程完成之前,我无法访问我网站的任何页面。

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

谁能告诉我为什么当用户关闭连接时 php 脚本不能停止?或者有什么方法可以保证用户退出时脚本可以停止?

谢谢。

【问题讨论】:

  • 如果没有相关脚本或检查日志文件,我们无法真正帮助您。

标签: php curl


【解决方案1】:

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

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

目标是在任务运行时不阻塞 UI。即使用户让浏览器保持打开状态,浏览器本身也可能会在一段时间后“放弃”,或者在等待太久的情况下,其他东西可能会使用户从 UX 中分离出来。让用户调用流程,但是把流程的调用和流程的执行分开,这样用户就可以返回到应用界面了。

【讨论】:

    【解决方案2】:

    来自 PHP 手册:

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

    因此,即使使用忽略用户中止,您也必须尝试在脚本内再次与客户端交互以确保其正确中止。请注意,在有问题的页面上,还有一些关于什么构成“发送信息”的附加说明(例如,显然 Echo 本身不符合条件)。

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

    【讨论】:

      猜你喜欢
      • 2017-02-24
      • 2012-02-12
      • 1970-01-01
      • 2013-05-14
      • 2021-08-01
      • 2013-04-05
      • 1970-01-01
      • 2021-01-15
      • 2021-09-11
      相关资源
      最近更新 更多