Можно ли настроить Guzzle + Pool через HTTP / 2? - PullRequest
3 голосов
/ 09 марта 2020

Guzzle предоставляет механизм отправки одновременных запросов: Pool. Я использовал пример из документов: http://docs.guzzlephp.org/en/stable/quickstart.html#concurrent -запросы . Он работает вполне нормально, отправляет параллельные запросы, и все замечательно, кроме одного: кажется, что Guzzle игнорирует HTTP / 2 в этом случае.

Я подготовил упрощенный скрипт, который отправляет два запроса на { ссылка }, первый использует пул, второй - обычный запрос на жадность. Только обычный запрос подключается через HTTP / 2.

<?php

include_once 'vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Pool;
use GuzzleHttp\Psr7\Request;

$client = new Client([
    'version' => 2.0,
    'debug' => true
]);

/************************/

$requests = function () {
    yield new Request('GET', 'https://stackoverflow.com');
};
$pool = new Pool($client, $requests());
$promise = $pool->promise();
$promise->wait();

/************************/

$client->get('https://stackoverflow.com', [
    'version' => 2.0,
    'debug' => true,
]);

Вот вывод: https://pastebin.com/k0HaDWt6 (я выделил важные части с помощью "!!!!!")

Кто-нибудь знает, почему Guzzle делает это и как заставить Pool работать с HTTP / 2?

1 Ответ

2 голосов
/ 10 марта 2020

Обнаружил, что было не так: new Client() на самом деле не принимает 'version' в качестве опции, если передано Pool, запросы создаются как new Request(). Либо версия протокола должна быть указана в качестве опции для каждого запроса, либо запросы должны быть созданы как $client->getAsync() (или ->postAsync или как угодно).

См. Исправленный код:

...

$client = new Client([
    'debug' => true
]);
$requests = function () {
    yield new Request('GET', 'https://stackoverflow.com', [], null, '2.0');
};
/* OR
$client = new Client([
    'version' => 2.0,
    'debug' => true
]);
$requests = function () use ($client) {
    yield function () use ($client) {
        return $client->getAsync('https://stackoverflow.com');
    };
};
*/
$pool = new Pool($client, $requests());
$promise = $pool->promise();
$promise->wait();

...
...