Каков правильный способ использования Guzzle 6 для создания пула асинхронных запросов json для отправки конечным точкам API?

Моя цель – использовать Guzzle 6 для создания пула асинхронных запросов, которые PUT json data. Затем отслеживайте каждый успешный результат / неудачу.

Для сравнения с моим примером кода POOL следующий одиночный запрос к $ client-> request () преобразует третий параметр в кодированный json, а затем добавляет Content-type: application / json. **

$client = new Client([ 'base_uri' => BASE_URL . 'test/async/', // Base URI is used with relative requests 'timeout' => 0, // 0 no timeout for operations and watching Promises ]); $response = $client->request('PUT', 'cool', ['json' => ['foo' => 'bar']]); 

В конечной точке получающего API я могу прочитать json из одного запроса выше, выполнив следующее:

 $json = file_get_contents('php://input'); $json = json_decode($json, true); 

Используя пример параллельных запросов в документах, для создания пула асинхронных запросов с использованием нового Request () я надеялся, что одни и те же параметры (метод, конечная точка url, json flag) могут использоваться, как в одиночном запросе $ client-> ) пример выше. Однако yield new Request() не обрабатывает третий параметр json, например $client->request() . Какова правильная функция Guzzle для вызова из моего кода пула, чтобы правильно установить json и content-type? Или есть лучший способ создать большой пул асинхронных запросов и контролировать их результат?

Пример кода POOL:

 $this->asyncRequests = [ [ 'endpoint' => 'cool' ], [ 'endpoint' => 'awesome' ], [ 'endpoint' => 'crazy' ], [ 'endpoint' => 'weird' ] ]; $client = new Client([ 'base_uri' => BASE_URL, // Base URI is used with relative requests 'timeout' => 0 // 0 no timeout for operations and watching Promises ]); $requests = function ($asyncRequests) { $uri = BASE_URL . 'test/async/'; foreach ($asyncRequests as $key => $data) { yield new Request('PUT', "{$uri}{$data['endpoint']}", ['json' => ['foo' => 'bar']]); } }; $pool = new Pool($client, $requests($this->asyncRequests), [ 'concurrency' => 10, 'fulfilled' => function ($response, $index) { $this->handleSuccessPromises($response, $index); }, 'rejected' => function ($reason, $index) { $this->handleFailurePromises($reason, $index); }, ]); $promise = $pool->promise(); // Initiate the transfers and create a promise $promise->wait(); // Force the pool of requests to complete. 

Надеюсь, кто-то еще скачет и сообщит мне, если есть более правильный способ выполнить мою задачу, но, посмотрев под капот в Гузлле, я понял, что третий параметр Request () искал информацию заголовка, а четвертый Параметр искал тело. Таким образом, следующий код работает с пулом:

 foreach ($syncRequests as $key => $headers) { yield new Request('PUT', "{$uri}{$headers['endpoint']}", ['Content-type' => 'application/json'], json_encode(['json' => ['nonce' => $headers['json']]])); } 

Также в документах для Psr7 \ Request введите описание изображения здесь

Если вы хотите получить полный контроль, не используйте объект Request () в вашем пуле. Вместо этого запустите запрос самостоятельно, создав генератор вашего пула вызывающей функцией, которая запускает запрос. Это дает вам полный контроль над всеми параметрами. Вот правильный пример кода:

https://stackoverflow.com/a/40622269/5562035