2

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

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 Request Error: XMLHTTPRequestObject status: (0, error), text status: (error), error throw: ()

4

3 回答 3

3

整个流程多处有超时设置:

  1. 浏览器/Ajax 调用
  2. PHP有自己的:ini_set('max_execution_time', '1800');set_time_limit(1800);
  3. Apache 本身有一个最大运行时间:超时apache2.conf
  4. 可能是您的 REST API - 但是您正在调用它

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

  1. 使用 ajax 将请求从客户端发送到您的服务器
  2. 从您的服务器异步运行 REST API(查找异步 curl 或 node.js)
  3. 客户端使用 ajax 定期查询服务器的状态(可能每 10 秒)

这使得整个过程异步,并且在处理发生时不需要您等待或阻塞

于 2013-09-10T17:00:34.007 回答
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);
}
于 2013-09-10T19:44:54.563 回答
0

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

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

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

  3. 您的 Web 服务器(Apache 和 IIS 不同。例如,在 IIS 中,如果您通过 FastCGI 运行 PHP,则必须在 FastCGI 设置中设置空闲超时、请求超时和活动超时)

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

如果您在所有这些地方都设置了超时,它应该可以工作。对我来说,我已经像你一样完成了所有其他步骤,但是直到我在我的 FastCGI 设置中设置了活动超时设置后问题才得到解决。

于 2014-01-07T00:37:47.293 回答