Ответ 1
В примере кода вы создаете новый GuzzleHttp\Client для каждого запроса, который хотите сделать. Это может показаться GuzzleHttp\Client, однако, во время создания GuzzleHttp\Client он будет устанавливать обработчик по умолчанию, если он не GuzzleHttp\Client. (Это значение затем передается на любой запрос, отправляемый через Клиент, если только он не переопределяется.)
Примечание. Он определяет лучший обработчик для использования с этой функцией. Хотя, скорее всего, это приведет к curl_mutli_exec.
Какая важность этого? Это базовый обработчик, который отвечает за отслеживание и выполнение нескольких запросов одновременно. Каждый раз создавая новый обработчик, ни один из ваших запросов не группируется и не работает вместе. Для более глубокого понимания этого возьмите curl_multi_exec в curl_multi_exec docs.
Итак, у вас есть два способа справиться с этим:
Пройдите через клиента через итератор:
$client = new GuzzleHttp\Client(['timeout' => 20]);
$iterator = function () use ($client) {
$index = 0;
while (true) {
if ($index === 10) {
break;
}
$url = 'http://localhost/wait/5/' . $index++;
$request = new Request('GET', $url, []);
echo "Queuing $url @ " . (new Carbon())->format('Y-m-d H:i:s') . PHP_EOL;
yield $client
->sendAsync($request)
->then(function (Response $response) use ($request) {
return [$request, $response];
});
}
};
$promise = \GuzzleHttp\Promise\each_limit(
$iterator(),
10, /// concurrency,
function ($result, $index) {
/** @var GuzzleHttp\Psr7\Request $request */
list($request, $response) = $result;
echo (string)$request->getUri() . ' completed ' . PHP_EOL;
}
);
$promise->wait();
или создать обработчик в другом месте и передать его клиенту: (Хотя я не уверен, почему вы это сделаете, но это там!)
$handler = \GuzzleHttp\HandlerStack::create();
$iterator = function () use ($handler) {
$index = 0;
while (true) {
if ($index === 10) {
break;
}
$client = new Client(['timeout' => 20, 'handler' => $handler])
$url = 'http://localhost/wait/5/' . $index++;
$request = new Request('GET', $url, []);
echo "Queuing $url @ " . (new Carbon())->format('Y-m-d H:i:s') . PHP_EOL;
yield $client
->sendAsync($request)
->then(function (Response $response) use ($request) {
return [$request, $response];
});
}
};
$promise = \GuzzleHttp\Promise\each_limit(
$iterator(),
10, /// concurrency,
function ($result, $index) {
/** @var GuzzleHttp\Psr7\Request $request */
list($request, $response) = $result;
echo (string)$request->getUri() . ' completed ' . PHP_EOL;
}
);
$promise->wait();