2013-07-01 20 views
0

我有这个使用Web服务的非常长的过程,我需要通过ajax请求使用单个按钮启动,因此我可以在过程完成时显示响应消息。 Ajax请求只是调用一个Zend控制器,它可以概括这种方式:ajax请求上的套接字读取超时:任何解决方法?

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

的$响应随后收到成功的参数,可以是HTML()倒是为一些响应格。

这一切都很顺利,但我现在发现,如果上述过程需要太多时间来运行,我的ajax请求将失败,因为502错误网关错误。 Firebug告诉我,每次5分钟和0秒后会发生这种情况,所以听起来很像超时。

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

对我现在有哪些选择有任何想法?

+0

你尝试设置''的set_time_limit在bootstrap.php中(0)? – DevZer0

+0

显然不是。将尝试。 – SylvainB

+0

试过了,5分钟后出现同样的错误网关错误。 – SylvainB

回答

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); 
}); 
相关问题