【问题标题】:Randomly get 504 Gateway Time-out after 40seconds40秒后随机得到504 Gateway Time-out
【发布时间】:2015-10-26 10:23:25
【问题描述】:

我的服务器正在运行 Apache、FPM/FastCGI 和 PHP 5.5.30。

我有 Laravel 5.0 框架和 Guzzle 来管理不同类型的 HTTP 请求。

在 Guzzle 之前,我使用 Rolling-Curl 并行发出请求。我将 Rolling-Curl 更改为 Guzzle 的原因是我随机出现 504 网关错误,但经过几次测试后,我注意到即使使用 Guzzle 也能得到它。

网关错误总是在 40 秒后发生,而且是随机发生的。如果我按几次 F5(刷新)它就会消失,但以后可能会再次发生。

以下是我的代码 sn-p

$feeds = Feeds::where('active', '=', '1')->lists('url');  

$client = new \GuzzleHttp\Client();

$requests = array();

foreach($feeds AS $feed)
{
  $requests[] = $client->createRequest('GET', $feed);
}

$pool = new Pool($client, $requests, [
  'pool_size' => '5',
  'timeout' => '120',
  'connect_timeout' => '120',
  'complete' => function (CompleteEvent $event) {
    echo 'Completed request to ' . $event->getRequest()->getUrl() . " - ". $event->getResponse()->getStatusCode() . "\n";
    //echo 'Response: ' . $event->getResponse()->getBody() . "\n\n";
  },       
  'error' => function (ErrorEvent $event) {
      echo 'Request failed: ' . $event->getRequest()->getUrl() . "\n";
      echo $event->getException();
  }
]);


$pool->wait();

echo "...done in " . (microtime(true) - $start);
?>

$feeds 正在从数据库中获取 100 个 RSS URL,我的池一次获取最多 5 个提要的内容。

【问题讨论】:

    标签: php laravel timeout guzzle gateway


    【解决方案1】:

    您能否发布您遇到的确切错误,并可能确定您的代码行指示异常被抛出的位置?我认为您可以单独或组合执行两件事来解决错误:

  • 'rejected' 函数添加到您的池启动选项以处理失败的请求,请参阅Guzzle documentation
  • 如果单独的'rejected' function选项不能修复它,则将您的代码行包装在try {} catch {} block


    请参阅下面修改的代码以包含我的建议:

    $feeds = Feeds::where('active', '=', '1')->lists('url');  
    
    $client = new \GuzzleHttp\Client();
    
    $requests = array();
    
    foreach($feeds AS $feed)
    {
        $requests[] = $client->createRequest('GET', $feed);
    }
    
    $pool = new Pool($client, $requests, [
      'pool_size' => '5',
      'timeout' => '120',
      'connect_timeout' => '120',
      'complete' => function (CompleteEvent $event) {
        echo 'Completed request to ' . $event->getRequest()->getUrl() . " - ". $event->getResponse()->getStatusCode() . "\n";
        //echo 'Response: ' . $event->getResponse()->getBody() . "\n\n";
      },       
      'error' => function (ErrorEvent $event) {
          echo 'Request failed: ' . $event->getRequest()->getUrl() . "\n";
          echo $event->getException();
       },
       //add the 'rejected' function
       'rejected' => function ($reason, $index) {
           //handle failed requests here
       },
    ]);
    
    //throw in the try{} catch {} block if the 'rejected' function is not fixing the 504 error
    try {
        //your code goes here...I suspect it's the $pool->wait()
        $promise = $pool->promise(); //I included this line from the Guzzle documentation
        $promise->wait();
    } catch (ServerException $e) {
        //Catch exception for 504 error here; you probabbly want to retry recursively a number of times before giving up...
    }
    
    echo "...done in " . (microtime(true) - $start);
    
  • 【讨论】:

      猜你喜欢
      • 2019-08-30
      • 2021-05-12
      • 2021-08-10
      • 2012-10-09
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 2019-07-10
      相关资源
      最近更新 更多