Я использовал Guzzle Pool для запроса данных (около 1-2 МБ на каждый запрос) с внешнего сервера в течение последних 6 месяцев. Делаю сразу 5 запросов одновременно. Однако все изменилось, и внешний сервер кажется перегруженным и поэтому стал очень медленным. Иногда это очень быстро, например, 1-2 секунды, но часто серверу нужно ждать 2+ минуты для каждого запроса.
Но это не должно быть проблемой. Однако в настоящее время (поскольку запросы становятся медленными) некоторые из моих запросов в пуле возвращают ошибку:
cURL error 18: transfer closed with outstanding read data remaining
Обычно это происходит через 2 минуты ожидания.
Интересно то, что если я сделаю запрос через Postman (например), то мне все равно придется ждать 2-3 + минуты, но в конце концов я получил ответ.
Это заставило меня поверить, что Guzzle блокирует запросы через 2 минуты. Однако я не смог найти никаких настроек, чтобы это изменить. Я даже пытался отправить заголовки Keep Alive
и Content-Length
, но они не работали (хотя, возможно, я использовал их неправильно).
Вот часть моего текущего кода, который выполняет запросы Guzzle Pool. (Я использую PHP 7.1, Guzzle 6.3 и Laravel 5.7).
$headers = ['Authorization' => 'Bearer ' . $token];
$client = new Client();
$requests = function ($urls, $headers)
{
foreach ($urls as $key => $url)
{
yield new Requests('GET', $url, $headers);
}
};
$pool = new Pool($client, $requests($urls, $headers),
[
'concurrency' => 5,
'fulfilled' => function ($response, $index)
{
echo 'fulfilled -> ' . $index;
},
'rejected' => function ($reason, $index)
{
echo 'rejected -> ' . $index . ' -> error:' . $reason->getMessage();
},
]);
$promise = $pool->promise();
$promise->wait();
К сожалению, я не могу поделиться URL-адресом внешнего сервера, потому что он частный.
Что я здесь делаю не так, что не позволяет запросу ждать завершения / отправки данных?
Обновление: Я попробовал рекомендацию @Alexey Shokov, которая избавила от отклоненных состояний. Теперь время ожидания запросов составляет не 2 минуты. Однако я получаю ноль в ответ, как только получаю что-то из ранее timed out
источников.