【问题标题】:Can closing the browser terminate the PHP script on the server?关闭浏览器可以终止服务器上的 PHP 脚本吗?
【发布时间】:2021-03-20 13:29:24
【问题描述】:

假设用户点击了一个按钮,导致一个 jquery ajax 请求被发送到我的服务器。

服务器响应 ajax 请求开始一个复杂的过程。假设这个过程需要 5 分钟才能完成。

与此同时,用户感到无聊并关闭了他的浏览器窗口。

服务器上的脚本会继续处理直到它在正常时间完成,还是会停止?

如果用户访问一个 url,例如 example.com/process.php?data=xxx,也是如此。这将启动 process.php,它开始处理数据,需要 5 分钟才能完成处理。

这个处理会一直继续吗,或者如果用户关闭浏览器,它会停止吗?

(我之所以这么问,是因为我担心这个过程会半途而废并导致数据损坏)。

【问题讨论】:

  • 在 window.onbeforeunload 上中止 HttpRequest ?
  • 92 岁的好问题!! :P

标签: php webserver


【解决方案1】:

PHP 的默认行为是当远程客户端断开连接时您的脚本将中止,这通常是由用户关闭浏览器或点击停止按钮引起的。当有人关闭与在 CLI 模式下运行的脚本的远程连接时,也会发生这种情况。脚本中止的一个例外是,如果您使用register_shutdown_function() 注册了关闭功能。有关详细说明,请参阅 PHP 文档中的 Connection Handling 页面。

脚本实际终止的点取决于调用flush() 的时间,它本质上是尝试将当前输出一直推送到浏览器/客户端。此时如果连接状态为ABORTED,则脚本将终止,除非我们忽略用户中止。

需要注意的重要一点是,您可以控制是否发生此行为,因为您指定有时不希望发生这种情况。使用ignore_user_abort() 函数或在php.ini 中设置相关指令。

【讨论】:

【解决方案2】:

PHP 不会注意到浏览器关闭了连接,除非它尝试输出一些东西(例如 echo)。如果输出失败,脚本将被终止,除非 ignore_user_abort 为 On。

所以脚本只有在满足以下条件时才会终止:

  • 脚本尝试输出某些内容(因为在此之前脚本不会注意到用户中止了连接)
  • AND php 的ignore_user_abort 设置关闭(如果设置关闭,如果输出失败,php 将终止脚本)

您可以通过启用ignore_user_abort 来避免脚本终止。

您可以随时使用connection_aborted() 来检查浏览器是否中止了请求。

脚本可能因其他原因意外终止(例如最大执行时间、异常等);所以你应该使用事务,以便脚本异常终止时取消半完成的更改。

【讨论】:

  • 你的意思是如果两种情况都发生,或者其中任何一种情况都发生?
  • PHP will not detect that the user has aborted the connection until an attempt is made to send information to the client. Simply using an echo statement does not guarantee that information is sent, see flush(). 所以看起来你是对的。使用哪个 Web 服务器(即 Apache、IIS)是否重要,或者它们的功能是否都相同?
  • 可能存在细微差别
  • 我猜,检测到中止的速度等;你必须测试自己
【解决方案3】:

请参阅:http://php.net/manual/en/function.ignore-user-abort.php。这取决于 ignore_user_abort 设置和其他一些条件。

【讨论】:

    【解决方案4】:

    除非它作为后台进程启动,即以 & 结尾...它将终止。

    稍微关闭浏览器...它最终会停止,但会在网络服务器意识到连接消失之前处理一段时间。

    【讨论】:

    • 你的意思是浏览器后台进程?
    • 这个答案让人感觉误导和不完整。
    • 你能分享更多细节吗?您将如何通过浏览器启动这样的“后台进程”?关于第二段:“最终停止”是什么意思有可靠的来源吗?
    猜你喜欢
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 2018-09-02
    相关资源
    最近更新 更多