【发布时间】:2017-05-28 03:44:50
【问题描述】:
有什么方法可以在请求之间使用 HTTP 持久连接? 我没有看到 CURL 扩展有办法创建一个供所有请求使用的连接池,就像 mysql、redis、pg 的其他扩展一样。
据我所知,您只能在同一请求中使用持久 http 连接。
西尔维乌
【问题讨论】:
标签: php http curl connection-pooling persistent-connection
有什么方法可以在请求之间使用 HTTP 持久连接? 我没有看到 CURL 扩展有办法创建一个供所有请求使用的连接池,就像 mysql、redis、pg 的其他扩展一样。
据我所知,您只能在同一请求中使用持久 http 连接。
西尔维乌
【问题讨论】:
标签: php http curl connection-pooling persistent-connection
PHP 的 pecl_http 扩展使用 libcurl 并允许您打开可重复使用的持久 TCP 连接:
$client = new http\Client('curl', $persistentHandleID);
$request = new http\Client\Request('GET', 'http://example.com/');
$client->enqueue($request);
$client->send();
$response = $client->getResponse($request);
如果在同一 PHP 进程上运行的另一个 $client(可能在不同的 PHP 请求期间)访问同一主机并共享同一 $persistentHandleID,它将通过与以前相同的 TCP 连接发送其 HTTP 请求。
在 PHP 模块关闭或$client 发送Connection: Close 或forbids further use of the connection 之前,TCP 连接将保持活动状态:
$client->setOptions(['forbid_reuse' => true, … ]);
【讨论】:
在 HTTP 中有 keep-alive 和流水线的概念。 Keep-Alive 允许在多个 HTTP 请求和响应中使用一个 TCP 连接。这允许浏览器在一个 TCP 连接上加载包含其所有资源(例如图像、脚本等)的网页,从而避免了连接设置和拆除开销。 CURL 默认使用这个,将Connection: keep-alive 附加到标题中。服务器配置为最大请求以及连接将保持打开状态的时间。但它仍然以请求-响应模式运行。
使用流水线可以在收到响应之前发出多个请求。流水线没有广泛实现,客户端和服务器都必须实现它。要在 CURL 中使用,您必须找到一个为您的客户端实现它的库(那里有一些),并且服务器也必须使用它。
如果您不确定您的 CURL 应用程序是否正在发送 keep-alive 标头,请使用 http 代理或数据包嗅探器来检查您的流量。
【讨论】:
Connection: 标头。 PHP 程序需要做的就是在执行后续请求时重用相同的 curl 句柄。