ajax中止请求在服务器端没有中止,只对客户端有效

3

显然我使用

var x=ajax.....

if(x){x.abort();}

但是这不会导致我的php文件内发生中止,顺便提一下,虽然选项默认为ignore_user_abort(false),但它仍然没有中止执行。
也就是说,如果连接断开,则脚本将不会继续执行。
问题在于,尽管js客户端上的ajax中止了,但似乎它仍在执行代码。
如何通过js成功停止客户端和服务器端的php。

ignore_user_abort()在断开连接时不会立即终止,需要一定时间让Web服务器意识到断开连接的发生,并将其传递给PHP。发送输出有助于更快地获得它,例如在json或html上下文中输出大量空格(=不影响呈现/功能)可以更早地检测到。 - Wrikken
2个回答

0

在大多数情况下,AJAX 的工作方式并不是这样的。一旦请求被发送到服务器,服务器就开始处理它了。即使 PHP 被设置为在客户端连接中断时停止脚本执行,在 Web 服务器配置中,它也不会进行检查,直到实际尝试将输出发送给客户端。因此,如果您正在执行典型的 AJAX 类型脚本,其中只有一个输出事件,客户端中止对服务器端没有任何影响。


好的,有没有一种方法,在js中abort之后立即调用第二个函数,将输入发送到php以停止php进程,使用sessions?如果设置了abort_sessionid,就会中止吗?为什么ajax停止不等于浏览器窗口关闭,理论上这会自动停止php脚本?谢谢。 - lbennet
http://php.net/manual/zh/function.ignore-user-abort.php 说调用该函数将导致脚本在客户端断开连接(中止)时中止。因此它会产生影响,你不能保证 PHP 脚本实际上已经中止,但它会尝试中止。 - Ruan Mendes
1
@JuanMendes 请阅读该页面上的“注释”部分。虽然你所说的是正确的,但 PHP 直到尝试向客户端输出时才会尝试检测中止,这使得客户端中止在大多数 AJAX 类型的场景中无用,其中服务器端脚本可能正在访问数据库,然后仅返回一个小的内容片段。执行中止仍将使脚本执行到实际发送输出的点。 - Mike Brant
我看到了,http://php.net/manual/en/function.ignore-user-abort.php 上的许多评论都解释说,解决这个问题的方法是立即向客户端刷新一些空格。这样应该会更快地导致中止,但你仍然不能完全依赖它。如果必须跟踪作业完成情况,你需要其他的东西来进行跟踪。 - Ruan Mendes
这是我的回答的主要观点,你不能依赖于中止操作真正地中止,你需要一个系统来检查作业是否完成。 - Ruan Mendes
显示剩余2条评论

0
如果您需要确认某件事被中止,您必须发送另一个请求以询问您的作业是否完成。这意味着在调用 xhr.abort() 后,您必须发送一个请求到类似于 /abort/jobId 的地址,以查找它是否能够在处理完之前中止。
没有什么神奇的方法可以保证 PHP 脚本在调用 abort() 后立即停止。

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