如果用户在 AJAX 请求完成之前退出浏览器或切换页面会发生什么?

22
我正在通过Ajax调用一个PHP脚本来执行一些数据库维护。如果用户关闭了页面、点击了后退按钮或者点击了链接,那么这个PHP脚本会完全执行吗?有没有办法可以做到呢?
也许如果PHP脚本调用了exec()方法或类似的方法,就可以通过控制台调用一个脚本,如下所示:
$ php /var/www/httpdocs/maintenance.php

(原文中的问号)
8个回答

17

这是一种竞态条件。PHP通常在尝试输出时会检测到Apache向其报告远程用户已关闭连接。此时是否完成了您想要执行的所有操作取决于您代码的结构。

如果您希望在脚本关闭之前确保完成所有操作,请使用ignore_user_abort(TRUE),它可以在连接断开后继续运行PHP。它仍然受用户max_execution_time等限制,但它不会因为您断开连接而关闭。


那么,如果Apache检测到远程连接已关闭,PHP脚本可能会在执行完成之前停止执行? - Alex Turpin
1
哈哈哈,我发现那个函数就在我发布问题后面,试图取消我的问题并自己回答它,但我还没有足够的声望。这是我想写的内容,很抱歉让大家浪费时间搜索错误的东西:好的,我仍然不知道 AJAX 到底会发生什么,但我找到了一种方法来防止 PHP 脚本在用户使用函数中断 php 脚本时终止: ignore_user_abort()http://php.net/manual/en/function.ignore-user-abort.php我应该从一开始就对 PHP 进行研究,我很快就找到了它。 - NaturalBornCamper
可以,但不一定。还有其他因素在起作用,但理论上,用户可以(例如)在商店库存更新后但付款未处理之前按ESC键完全破坏电子商务结帐过程。 - Marc B
Ajax请求与其他HTTP请求一样,只是通过脚本在后台完成,而不是通过显式用户操作。 - Marc B

13
只要用户代理(浏览器等)已经完全发送请求,服务器就拥有了全部所需内容,并将完成请求并尝试发送响应。实际上,这种“ping”行为通常用于类似“心跳”的流程,以保持服务的稳定或执行定期维护。

4
一旦网络请求到达您的服务器,即使用户关闭浏览器或离开页面,也不会影响服务器的回应。但此时没有人会接收到这个响应。

有没有办法避免这种情况? - Sushant Bajracharya
@SushantBajracharya 您可以使用一个变量,在调用时将其设置为“1”,如果用户在变量为“1”时尝试重定向,则会收到一条消息告诉他们不能这样做。当调用完成后,它会返回到“0”并允许重定向。 - Kenton de Jong

1

这取决于设置、Web服务器、操作系统等等。

通常情况下,请求会像往常一样被处理,但响应将永远不会被读取。偶尔会出现写入失败的情况,导致请求在处理过程中失败。


0

一旦发起了ajax调用,用户就可以自由地做任何他们想做的事情。如果他们关闭页面,他们将无法从所做的ajax调用中获得反馈(如果有的话)。


0
如果 PHP 开始执行,那么它将继续执行,无论用户是否关闭窗口或导航离开页面。

0

无论浏览器状态如何,php脚本都将完成。php在服务器上解析,不关心客户端是否仍然打开。


0
如果HTTP请求已完成,那么即使客户端计算机关闭,PHP脚本也将完全执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接