请求guzzle并发http请求如何复用一个tcp连接呢

问题:使用guzzle并发请求同一个域名的时候tcp无法复用(lsof查看打开了多个tcp),如何才能复用呢

require 'vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request;
use GuzzleHttp\Promise;

$client = new Client(['base_uri' => 'http://xxx']);

$promises = [
    'test' => $client->getAsync('/test'),
    'test1'   => $client->getAsync('/test1'),
    'test2'  => $client->getAsync('/test2'),
];

$results = Promise\unwrap($promises);
var_dump($results);
阅读 5k
1 个回答

不能手动分配,Guzzle 代码里写死了。

不过它也不是每个请求都会建立个新的 TCP Socket,它自己内部维护了一个连接池,复用问题对你来说是黑盒的。

你可以尝试一下手动指定 CURLOPT_FORBID_REUSECURLOPT_FRESH_CONNECT 这几个参数为 false,默认来说就是 false 的,不应该出现不复用的问题。(跟这个问题里的反过来:https://github.com/guzzle/guz... 他是不想要 TCP 复用)

P.S. Connection: keep-alive 这玩意儿就是个协定,说白了前后端都遵守了才行。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题