Случайно получите 504 Время ожидания шлюза через 40 секунд

Мой сервер работает под управлением Apache, FPM / FastCGI и PHP 5.5.30.

У меня есть фреймворк Laravel 5.0 и Guzzle для управления различными видами HTTP-запросов.

До Guzzle я использовал Rolling-Curl, чтобы делать запросы в paraller. Причина, по которой я изменил Rolling-Curl на Guzzle, заключается в том, что я случайно получил 504 ошибки Gateway, но после нескольких тестов я заметил, что получаю его даже с Guzzle.

Ошибка шлюза происходит всегда через 40 секунд и происходит случайно. Если я нажму пару раз F5 (обновить), он исчезнет, ​​но может произойти позже.

Ниже приведен мой фрагмент кода

$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 URL-адресов RSS из базы данных, и мой пул получает содержимое максимум 5 каналов одновременно.

0

Решение

Не могли бы вы опубликовать точную ошибку, которую вы получаете, и, возможно, определить строку кода, указанную для того, где выдается исключение? Я думаю, что есть 2 вещи, которые вы можете сделать отдельно или в комбинации, чтобы устранить ошибку:

  • добавить 'rejected' Функция для параметров запуска пула для обработки неудачных запросов, см. Жрать документацию
  • оберните строку вашего кода, выбрасывая ошибку в try {} catch {} block если 'rejected' functionодин вариант не исправляет

    Смотрите ваш код с изменениями ниже, чтобы включить мои предложения:

    $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);
    
    0
  • Другие решения

    Других решений пока нет …

    По вопросам рекламы [email protected]