我有一个网页,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,错误),文本状态:(错误),抛出错误:()
答案 0 :(得分:2)
整个过程中有多个地方都有超时设置:
- 浏览器/ Ajax调用
- PHP有自己的:
ini_set('max_execution_time', '1800');
或set_time_limit(1800);
- Apache本身有一个最长运行时间:超时
apache2.conf
- 可能是您的REST API - 无论您是在呼叫它
醇>
我认为最好的情况是从阻塞/同步策略转变为异步策略:
这使整个过程异步,并且不需要您在处理过程中等待或阻止
答案 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个不同的位置设置超时长度:
Jquery本身(可以像你一样使用timeout参数,或者使用$ .ajaxSetup函数全局完成)
PHP通过在php.ini中设置max_execution_time
您的Web服务器(Apache和IIS不同。例如,在IIS中,如果您通过FastCGI运行PHP,则必须在FastCGI设置中设置Idle Timeout,Request Timeout和Activity Timeout )
可能是您的浏览器本身,虽然过去这对我来说不是必需的
如果在所有这些地方设置超时,它应该有效。对我来说,我已经像你一样完成了所有其他步骤,但直到我在FastCGI设置中设置了活动超时设置才解决问题。