假设用户点击了一个按钮,导致jquery ajax请求被发送到我的服务器。
服务器开始一个复杂的过程以响应ajax请求。让我们说这个过程需要5分钟才能完成。
与此同时,用户感到无聊并关闭了他的浏览器窗口。
服务器上的脚本会继续处理,直到它正常结束,还是会停止?
如果用户访问网址也是如此,例如example.com/process.php?data=xxx。这将启动process.php,它开始处理数据,并将花费5分钟完成处理。
此处理是否会继续,或者如果用户关闭浏览器,它会停止吗?
(我问,因为我担心这个过程会被完成一半并导致数据损坏。)
答案 0 :(得分:21)
PHP不会注意到浏览器会关闭连接,除非它尝试输出某些内容(例如echo)。如果输出失败,除非ignore_user_abort
开启,否则脚本将被终止。
因此,只有满足以下条件时脚本才会终止:
ignore_user_abort
设置已关闭(如果设置已关闭,如果输出错误,php将终止脚本)您可以通过启用ignore_user_abort
来避免脚本终止。
您可以随时使用connection_aborted()
来检查浏览器是否中止了请求。
由于其他原因(例如最大执行时间,异常等),脚本可能会意外终止;因此,您应该使用事务,以便在脚本异常终止时取消半成品更改。
答案 1 :(得分:3)
请参阅:http://php.net/manual/en/function.ignore-user-abort.php。它取决于ignore_user_abort设置和一些其他条件。
答案 2 :(得分:1)
PHP的默认行为是,当远程客户端断开连接时,您的脚本将被中止,这通常是由用户关闭浏览器或点击停止按钮引起的。当某人关闭与以CLI模式运行的脚本的远程连接时,也会发生这种情况。脚本中止的一个例外是使用register_shutdown_function()
注册了关闭功能。有关详细说明,请参阅PHP文档中的Connection Handling页面。
脚本实际终止的时间取决于何时调用flush()
,这实际上是尝试将当前输出一直推送到浏览器/客户端。此时,如果连接状态为ABORTED
,则脚本将终止,除非我们忽略用户中止。
需要注意的重要一点是,您可以控制是否发生此行为,因为您有时指定不希望发生这种情况。使用ignore_user_abort()
函数或在php.ini中设置相关指令。
答案 3 :(得分:-1)
除非它作为后台进程启动,即使用&最后......它会终止。
关闭浏览器...它最终会停止,但会在Web服务器实现连接消失之前处理一段时间。