Мой сервер работает под управлением 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 каналов одновременно.
Не могли бы вы опубликовать точную ошибку, которую вы получаете, и, возможно, определить строку кода, указанную для того, где выдается исключение? Я думаю, что есть 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);
Других решений пока нет …