0

我使用 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 然后作为success的参数被接收,并且可以被 html()'d 到一些响应 div 中。

有一段时间一切顺利,但我现在发现,如果上述进程运行时间过长,我的 ajax 请求将失败,因为 502 Bad Gateway 错误。Firebug 告诉我这发生在每次 5 分 0 秒后,所以听起来很像超时。

我发现这个链接似乎讨论了完全相同的问题。它帮助我更好地识别问题,但我想不出任何解决方案。有没有办法增加这个超时?我尝试在标准输出上使用 stream_set_timeout(),但我显然不知道我在做什么,因此它显然不起作用。

对我现在的选择有什么想法吗?

4

1 回答 1

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

阿贾克斯调用:

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);
});
于 2013-07-02T11:39:38.487 回答