关闭浏览器可以终止服务器上的 PHP 脚本吗?

2022-08-30 17:11:50

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

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

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

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

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

此处理是始终继续,还是如果用户关闭浏览器,它将停止?

(我问这个问题是因为我担心这个过程只完成了一半,导致数据损坏)。


答案 1

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

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

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

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

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

脚本可能由于其他原因(例如.max执行时间,异常等)而意外终止;因此,您应该使用事务,以便在脚本异常终止时取消半完成的更改。


答案 2

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


推荐