Как отправить сразу несколько запросов ReactPHP?

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

$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

Любые идеи?


person Patrioticcow    schedule 17.09.2018    source источник


Ответы (1)


Прежде всего, вам не нужен 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 (я разработчик, так что не стесняйтесь задавать вопросы).

person Alexey Shokov    schedule 18.09.2018
comment
Да, сейчас я использую Guzzle Async. Он отлично работает. Я просто хотел попробовать ReactPHP и посмотреть, прибавлю ли я скорости. У вас есть пример использования guzzle-react-bridge с чем-то похожим на мой сценарий? - person Patrioticcow; 20.09.2018
comment
Я поищу пример, но к приросту скорости это не приведет, к сожалению. guzzle-react-bridge обеспечивает совместимость, но не заменяет обработчик cURL Guzzle на ReactPHP. - person Alexey Shokov; 20.09.2018