Как отправить несколько запросов одновременно ReactPHP? - PullRequest
0 голосов
/ 18 сентября 2018

Я использую жадность для отправки некоторых запросов:

$response = $this->client->request(new SomeObject());

используя класс ниже

...
public function request(Request $request)
{
    return $this->requestAsync($request)->wait();
}

// Here I'm using Guzzle Async, but I can remove that is needed
public function requestAsync(Request $request)
{
    $promise = $this->http->requestAsync($request->getMethod(), $request->getUri());

    $promise = $promise->then(
        function (ResponseInterface $response) use ($request) {
            return $response;
        }
    );

    return $promise;
}
...

Я хотел бы использовать ReactPHP для одновременной отправки нескольких запросов в цикле foreach:

$requests = [];
foreach ($data as $value) {
    $requests[] = $this->client->request(new SomeObject());
}

// pass $requests to ReactPHP here and wait on the response

Есть идеи?

1 Ответ

0 голосов
/ 18 сентября 2018

Прежде всего, вам не нужен ReactPHP для использования параллельных HTTP-запросов с Guzzle. Сам Guzzle предоставляет эту функцию (если вы используете обработчик cURL, который используется по умолчанию).

Например:

$promises = [];
foreach ($data as $value) {
    $promises[] = $guzzleClient->getAsync(/* some URL */);
}

// Combine all promises
$combinedPromise = \GuzzleHttp\Promise\all($promises)

// And wait for them to finish (all requests are executed in parallel)
$responses = $combinedPromise->wait();

Если вы все еще хотите использовать Guzzle с циклом событий ReactPHP, то, к сожалению, не существует простого решения. Вы можете взглянуть на https://github.com/productsupcom/guzzle-react-bridge (я разработчик, поэтому не стесняйтесь задавать вопросы).

...