我有一个使用Web服务的这个漫长的过程,我需要通过ajax请求通过一个按钮启动,所以我可以在完成该过程时显示响应消息。 ajax请求只调用一个Zend Controller,可以这样概括:
public function myajaxAction() {
$myModel = new MyModel();
$someData = $myModel->fetchAll();
foreach ($someData as $dataElement) {
$response = call_to_remote_client($dataElement['ID']);
echo $response;
}
$this->_helper->viewRenderer->setNoRender();
$this->_helper->getHelper('layout')->disableLayout();
}
然后接收$ response作为成功的参数,并且可以将html()转换为某个响应div。
这一切都进展顺利,但我现在发现,如果上述过程花费太多时间运行,我的ajax请求将失败,因为502 Bad Gateway错误。 Firebug告诉我,每次5分钟和0秒后都会发生这种情况,所以听起来很像是超时。
我发现this link似乎在讨论完全相同的问题。它帮助我更好地识别问题,但我想不出任何解决方案。有没有办法增加这个超时?我尝试在stdout上使用stream_set_timeout(),但我显然不知道我在做什么,因此它显然不起作用。
现在对我的选择有何看法?
答案 0 :(得分:0)
我想了一会儿,因为我不能以任何方式增加这个超时(系统管理员说没有),我不得不辞职并寻找另一个选择:递归ajax调用。这是代码。
控制器:
public function myajaxAction() {
$request = $this->getRequest();
$turn = $request->getParam('turn');
$myModel = new MyModel();
$someData = $myModel->fetchAll(null, null, 50, $turn * 50);
$response = array();
foreach ($someData as $dataElement) {
$result = call_to_remote_client($dataElement['ID']);
$response[] = $result;
}
$this->_helper->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender(true);
echo json_encode($response);
}
Ajax电话:
var recurseajax = function(turn) {
$.ajax({
type: 'POST',
url: '/myzend/ajax/myajax',
data: {'turn':turn},
success: function (data) {
var respond = $.parseJSON(data);
var len = respond.length;
for (var i = 0; i < len; i++) {
$("#responsediv").append(respond[i]);
}
if (len === 50) recurseajax(turn + 1);
else $('#loading').hide();
}
});
};
$('#myButton').click(function (){
$('#loading').show();
recurseajax(0);
});