鍍金池/ 問答/PHP/ PHP阻塞問題 高手請進?。?!

PHP阻塞問題 高手請進?。?!

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;
回答
編輯回答
抱緊我

答案是:不會的。

  1. 對于前端來說,ajax本身是異步,所以,前端頁面的信息是不會被阻塞。
  2. 對于后端來說,服務器本身是對端口進行監(jiān)聽,再分配資源去處理信息,等于是多次請求并不會互相干擾,所以3次ajax請求并不會有互相阻塞的說法。

可能會出現(xiàn)互相干擾的情況在于,當請求過多,服務器自身壓力過大,導致服務器崩潰。這樣的話,不再是阻塞的問題,而是所有的請求都會被拒絕。

2018年6月18日 16:31
編輯回答
拽很帥

AJAX本身不存在阻塞,但是在PHP默認的配置下,PHP本身會發(fā)生阻塞,因為默認的話PHP是單線程的。所以AJAX2和3要等1執(zhí)行完才可以。

2017年9月9日 20:05
編輯回答
維她命

sleep是可以阻塞其他請求的訪問的。關鍵在于你的請求是否是用的用一個 fast-cgi 進程。

2018年4月29日 11:00
編輯回答
孤星

不一定阻塞. 要看具體情況. 比如你使用 nginx+php-fpm的架構. 你每次的http請求 由NGINX轉發(fā)到 php-fpm. php-fpm 同一時間是只能處理一個請求的. 如果你的PHP-FPM進程數大于2 就不會阻塞. 否則就會沒有PHP-FPM進程處理請求而超時. 不過這個超時是網絡請求層面的. 和程序阻塞概念不一樣.

2018年3月28日 12:44
編輯回答
枕邊人

你模擬不就知道了,js直接發(fā)三個ajax請求過去
順序是ajax1,ajax2,ajax3
分別帶參數sleepTime1=10,sleepTime2=5,sleepTime3=2,
然后你打開調試network,你看三個ajax哪個先response。

2017年10月19日 23:06
編輯回答
薔薇花

用的apache php mod,配置里只要apache進程的數量超過3,就不會阻塞。
用的nginx + php-fpm,fpm進程數量只要超過3,就不會阻塞。

2018年8月21日 04:51