【问题标题】:Socket read timeout on ajax request: any workaround?ajax 请求的套接字读取超时:任何解决方法?
【发布时间】:2013-06-28 17:11:21
【问题描述】:

我有一个使用 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 秒后,所以听起来很像超时。

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

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

【问题讨论】:

  • 你试过在 Bootstrap.php 中设置set_time_limit(0) 吗?
  • 显然不是。会试试的。
  • 试过了,5分钟后出现同样的Bad Gateway错误。
  • 您的过程数据功能是做什么的?你能把代码贴出来吗
  • 从技术上讲,它不是一个函数,我只是想通过将处理部分总结为一个通用函数来使问题尽可能简单,但我明白你的意思。我编辑了我的摘要以添加有关该过程的详细信息。我认为重要的是,如果我在 30 转之后从循环中中断,这将非常有效。它输出结果,没有超时错误。而且问题不可能是无限循环,因为我只是在有限数组上使用 foreach。

标签: php ajax zend-framework timeout


【解决方案1】:

我想了一会儿,因为我不能以任何方式增加这个超时时间(系统管理员说不),我不得不辞职并寻求另一个选择:递归 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);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多