Моя цель — использовать Guzzle 6 для создания пула асинхронных запрашивает данные PUT json. Затем отслеживайте каждый успех/неудача $promise.
Для сравнения с моим примером кода 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);
Используя пример параллельных запросов в документации, для создания пула асинхронных запросов с помощью new Request(), я надеялся, что можно использовать те же параметры (метод, конечная точка URL, флаг json), что и в примере с одним $client->request() выше. Однако yield new Request()
не обрабатывает третий параметр json, например $client->request()
. Какую правильную функцию Guzzle следует вызывать из кода моего пула, чтобы правильно установить json и тип контента? Или есть лучший способ создать большой пул асинхронных запросов и отслеживать их результат?
Пример кода 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.