首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以在HTTP/2上设置Guzzle + Pool吗?

可以在HTTP/2上设置Guzzle + Pool吗?
EN

Stack Overflow用户
提问于 2020-03-09 23:32:58
回答 1查看 724关注 0票数 3

Guzzle提供了一个发送并发请求的机制:池。我使用了文档中的示例:http://docs.guzzlephp.org/en/stable/quickstart.html#concurrent-requests。它工作得很好,发送并发请求,一切都很棒,除了一件事:在这种情况下,Guzzle似乎忽略了HTTP/2。

我已经准备了一个简化的脚本,它向https://stackoverflow.com发送两个请求,第一个是使用池,第二个只是一个常规的Guzzle请求。只有常规请求通过HTTP/2连接。

代码语言:javascript
复制
<?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一起工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-10 15:01:14

发现了问题所在:如果传递给Pool的请求被创建为new Request(),那么new Client()实际上并不接受'version'作为选项。要么必须将协议版本作为每个请求的选项提供,要么必须将请求创建为$client->getAsync() (或->postAsync或其他格式)。

请参阅更正后的代码:

代码语言:javascript
复制
...

$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();

...
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60603792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档