0

a.html有三个ajax方法(ajax1,ajax2,ajax3),先后访问a.php,如果ajax1访问a.php程序sleep(15)。请问这样会不会阻塞ajax2,ajax3的访问呢,原因是什么?

a.html代码如下:

var a = 1;
var b = 1;
var c = 1;
function ajax1(){
    $.get('a.php?from=a', function(){
        $('#ajax1').text(a);
        a++;
        ajax1();
    });
}
function ajax2(){
    $.get('a.php?from=b', function(){
        $('#ajax2').text(b);
        b++;
        ajax2();
    });
}
function ajax3(){
    $.get('a.php?from=c', function(){
        $('#ajax3').text(c);
        c++;
        ajax3();
    });
}

function beginAjax(){
    ajax1();
    ajax2();
    ajax3();
}

a.php代码如下:

<?php
$from= $_GET['from'];
if($from == 'a'){
    sleep(15);
}
echo 1;

7个回答

1

你模拟不就知道了,js直接发三个ajax请求过去
顺序是ajax1,ajax2,ajax3
分别带参数sleepTime1=10,sleepTime2=5,sleepTime3=2,
然后你打开调试network,你看三个ajax哪个先response。

1

不一定阻塞. 要看具体情况. 比如你使用 nginx+php-fpm的架构. 你每次的http请求 由NGINX转发到 php-fpm. php-fpm 同一时间是只能处理一个请求的. 如果你的PHP-FPM进程数大于2 就不会阻塞. 否则就会没有PHP-FPM进程处理请求而超时. 不过这个超时是网络请求层面的. 和程序阻塞概念不一样.

0

如果发起ajax的方式是同步且代码都在一个页面,会阻塞下面的js运行,也就无法发起ajax2和ajax3。

否则不会阻塞其他ajax的请求和处理。

三次ajax请求,PHP端会用三个不同进程处理,进程之间互不影响。

0

答案是:不会的。

  1. 对于前端来说,ajax本身是异步,所以,前端页面的信息是不会被阻塞。
  2. 对于后端来说,服务器本身是对端口进行监听,再分配资源去处理信息,等于是多次请求并不会互相干扰,所以3次ajax请求并不会有互相阻塞的说法。

可能会出现互相干扰的情况在于,当请求过多,服务器自身压力过大,导致服务器崩溃。这样的话,不再是阻塞的问题,而是所有的请求都会被拒绝。

0

sleep是可以阻塞其他请求的访问的。关键在于你的请求是否是用的用一个 fast-cgi 进程。

0

用的apache php mod,配置里只要apache进程的数量超过3,就不会阻塞。
用的nginx + php-fpm,fpm进程数量只要超过3,就不会阻塞。

0

AJAX本身不存在阻塞,但是在PHP默认的配置下,PHP本身会发生阻塞,因为默认的话PHP是单线程的。所以AJAX2和3要等1执行完才可以。

撰写答案