JQuery .ajax超时增加不起作用

时间:2013-08-28 01:12:29

标签: php javascript ajax jquery

我有一个网页,javascript通过.ajax()函数使用POST请求调用PHP服务器。 PHP服务器又调用外部第三方API来提交文本分析作业。处理完文本分析作业后,我的PHP服务器会查询API的结果。但是,第三方REST API不提供任何查询作业状态的方法。所以在我提交工作后,我让我的程序睡了大约一分钟,然后查询结果。但是,有时我的结果不完整。我尝试将休眠时间设置为较大,但将其设置为超过一分钟似乎会使初始POST请求从Javascript到PHP超时。将ajax timeout参数设置为高无济于事。有没有人有关于如何解决这个问题的建议?任何帮助都非常感谢。

ajax请求如下所示:

function callServer(params, success) {
    var url = "ie.php";
    $.ajax({
       type: 'POST',
       url: url,
       data: params,
       timeout: 60000000, //time out parameter doesn't work
       dataType: "json",
       success: function(result, textStatus) {
                    console.log(JSON.stringify(result, null, '  '));
            if (success) success(result);
       },
       error: function(xhr, textStatus, errorThrown) {
                    var text = 'Ajax Request Error: ' + 'XMLHTTPRequestObject status: ('+xhr.status + ', ' + xhr.statusText+'), ' +
                                            'text status: ('+textStatus+'), error thrown: ('+errorThrown+')';
                    console.log('The AJAX request failed with the error: ' + text);
                    console.log(xhr.responseText);
                    console.log(xhr.getAllResponseHeaders());
       }
    });
}

错误如下所示:

AJAX请求失败并显示错误:Ajax请求错误:XMLHTTPRequestObject状态:(0,错误),文本状态:(错误),抛出错误:()

3 个答案:

答案 0 :(得分:2)

整个过程中有多个地方都有超时设置:

  
      
  1. 浏览器/ Ajax调用
  2.   
  3. PHP有自己的:ini_set('max_execution_time', '1800');或   set_time_limit(1800);
  4.   
  5. Apache本身有一个最长运行时间:超时apache2.conf
  6.   
  7. 可能是您的REST API - 无论您是在呼叫它
  8.   

我认为最好的情况是从阻塞/同步策略转变为异步策略:

  1. 使用ajax将请求从客户端发送到您的服务器
  2. 异步运行服务器中的REST API(查找异步curl或node.js)
  3. 客户端使用ajax定期查询服务器的状态(可能每10秒)
  4. 这使整个过程异步,并且不需要您在处理过程中等待或阻止

答案 1 :(得分:0)

你能这样做吗?

function callServer(params, success) {
    var url = "ie.php";
    setTimeout(function(){
        $.ajax({
           type: 'POST',
           url: url,
           data: params,
           dataType: "json",
           success: function(result, textStatus) {
                        console.log(JSON.stringify(result, null, '  '));
                if (success) success(result);
           },
           error: function(xhr, textStatus, errorThrown) {
                        var text = 'Ajax Request Error: ' + 'XMLHTTPRequestObject status: ('+xhr.status + ', ' + xhr.statusText+'), ' +
                                                'text status: ('+textStatus+'), error thrown: ('+errorThrown+')';
                        console.log('The AJAX request failed with the error: ' + text);
                        console.log(xhr.responseText);
                        console.log(xhr.getAllResponseHeaders());
           }
        })
    }, 200);
}

答案 2 :(得分:0)

要修复这些超时错误,您需要在3或4个不同的位置设置超时长度:

  1. Jquery本身(可以像你一样使用timeout参数,或者使用$ .ajaxSetup函数全局完成)

  2. PHP通过在php.ini中设置max_execution_time

  3. 您的Web服务器(Apache和IIS不同。例如,在IIS中,如果您通过FastCGI运行PHP,则必须在FastCGI设置中设置Idle Timeout,Request Timeout和Activity Timeout )

  4. 可能是您的浏览器本身,虽然过去这对我来说不是必需的

  5. 如果在所有这些地方设置超时,它应该有效。对我来说,我已经像你一样完成了所有其他步骤,但直到我在FastCGI设置中设置了活动超时设置才解决问题。