24

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

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

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

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

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

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

(我问是因为我担心该过程会完成一半并导致数据损坏)。

4

4 回答 4

31

PHP 不会注意到浏览器关闭了连接,除非它试图输出一些东西(例如 echo)。如果它无法输出某些内容,脚本将被终止,除非ignore_user_abort是 On。

因此,仅当满足以下条件时,脚本才会终止:

  • 脚本尝试输出一些东西(因为脚本直到那时才注意到用户中止了连接)
  • AND php 的ignore_user_abort设置是关闭的(如果设置是关闭的,如果输出失败,php 将终止脚本)

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

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

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

于 2012-07-06T10:19:05.633 回答
3

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

于 2012-07-06T10:21:24.917 回答
1

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

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

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

于 2012-07-06T10:43:12.677 回答
-2

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

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

于 2012-07-06T10:17:50.593 回答