ajax请求是Pending并行请求

时间:2017-01-24 10:15:52

标签: javascript php jquery ajax session

当我正在加载im调用两个ajax请求时,我正在做什么

fetch_list_big();
fetch_list_small();

function fetch_list_big(){
  $.post(...);
}
function fetch_list_small(){
  $.post(...);
}

顾名思义,fetch_list_big()中的请求需要的时间比fetch_list_small要长。 但是,由于fetch_list_big首先被调用,fetch_list_small表示待处理直到fetch_list_big返回200。

big.php

require_once('files_same.php'); #starts session /connection / configurations etc

#Some heavy mysql stuff  #say 5 seconds

echo json(...)

small.php

require_once('files_same.php'); #starts session /connection / configurations etc

#Some light mysql stuff #say 1 seconds

echo json(...)

如何以并行方式fetch_list_small()之后调用fetch_list_big()而不是将其挂起?

待处理的请求

http://i.imgur.com/vj07tyI.png

第一个请求很大,服务器需要5秒

最后3个是小请求,应该在第一个请求之前返回,但它们正在等待。

第一次请求后返回200

http://i.imgur.com/liPuO70.png

第一次请求后返回200。最后3个请求被执行。

问题

我希望所有请求都能在没有锁定服务器的情况下运行并行(某种会话被锁定了吗?)

2 个答案:

答案 0 :(得分:0)

您可以在fetch_list_big()

中使用回调
function fetch_list_big(callback){

    $.post(url, function(data){

        if(callback){

            callback();

        }

    });

}

fetch_list_big(function(){

    fetch_list_small();

});

答案 1 :(得分:0)

  

我希望所有请求都能在没有锁定服务器的情况下运行并行(某种会话被锁定了吗?)

是;只要一个脚本实例正在使用它,PHP就会阻止其他脚本访问会话。 (至少对于默认的基于文件的会话存储机制。)

一旦您的脚本完成了他们对会话的处理,您就可以通过调用session_write_close来避免这种情况。