不等待来自AJAX请求的响应

Fin*_*orm 9 javascript php ajax

假设我从jQuery向后端PHP脚本发出AJAX HTTP请求.请求发出后,PHP脚本开始运行并发挥其魔力.假设我转到另一个网站,远离原始AJAX请求的网站.同样,我在PHP脚本完成之前执行此操作,并有时间回复HTTP响应.即使我在获得HTTP响应之前切换到另一个网站,PHP脚本是否已完成运行并执行其操作?

所以顺序就是这样.

  • 我在网站www.xyz.com上
  • 我有一个jQuery处理程序,它启动了对blah.php的AJAX请求
  • blah.php开始运行
  • 我很快就去了www.abc.com网站,没有等到blah.php的回复

blah.php发生了什么事?执行还在继续吗?它停止了吗?我的意思是它没有机会回应......

mje*_*jec 8

这可能取决于您的服务器配置,但通常尽管关闭HTTP连接,脚本仍将继续执行.

我用Apache 2 + PHP 5测试了这个mod_php.我希望PHP与CGI和其他网络服务器有类似的行为,但不确定.

确定您的配置的最佳方法是,正如@tdammers建议的那样:设置类似以下内容的测试脚本并监视日志.

<?php
error_log('Test script started.');
for ($i = 1; $i < 13; $i++) {
    sleep(10);
    error_log('Test script got to ' . (10 * $i) . ' seconds.');
}
error_log('Test script got to the end.');
?>
Run Code Online (Sandbox Code Playgroud)

访问此脚本(在/test.php或等等),然后在获得任何结果之前,在浏览器上点击停止.这相当于在XHR返回之前导航.您甚至可以将其作为XHR的目标并导航.

然后检查你的错误日志:你应该有一个开始,然后每隔10秒发送一次消息,持续两分钟,然后结束.您可以修改有多高$i,以确保您的脚本达到预期的最长执行时间,如果您也想测试它.

您不必使用error_log()- 您可以写入文件,或在服务器上进行一些其他持久性更改,而无需保持客户端连接打开.

由于max_execution_timephp.ini指令,脚本执行时间可能在此之前停止- 但无论如何这应该与web服务器超时时不同.


gen*_*sis 6

尝试ignore_user_abort(true);

ignore_user_abort(true);
Run Code Online (Sandbox Code Playgroud)

它不应该中止你的代码进程

  • @FinalForm:这个答案与我的年龄有什么关系? (3认同)