ajax请求上的套接字读取超时:任何解决方法?

时间:2013-07-01 14:27:17

标签: php ajax zend-framework timeout

我有一个使用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(),但我显然不知道我在做什么,因此它显然不起作用。

现在对我的选择有何看法?

1 个答案:

答案 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);
});