Ответ 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();