php 和持续 HTTP 连接
php and persistent HTTP connections
有什么方法可以在请求之间使用 HTTP 持久连接?
我没有看到 CURL 扩展有办法创建所有请求都使用的连接池,就像 mysql、redis、pg.
的其他扩展一样
据我所知,您只能在同一个请求中使用持久性 http 连接。
西尔维
在HTTP中有keep-alive和流水线的概念。 Keep-Alive 允许一个 TCP 连接用于多个 HTTP 请求和响应。这允许浏览器在一个 TCP 连接上加载网页及其所有资源(例如图像、脚本等),从而避免了连接设置和拆除开销。 CURL 默认使用此 ,将 Connection: keep-alive
附加到 header。服务器配置为最大请求数以及连接将保持打开状态的时间。但它仍然以请求-响应模式运行。
通过流水线,可以在收到响应之前发出多个请求。流水线没有广泛实施,客户端和服务器都必须实施它才能工作。要在 CURL 中使用,您必须找到一个为您的客户端实现它的库(那里有一些),并且服务器也必须再次利用它。
如果您不确定您的 CURL 应用程序是否正在发送 keep-alive header,请使用 http 代理或数据包嗅探器来检查您的流量。
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 请求。
TCP 连接将保持活动状态,直到 PHP 模块关闭或直到 $client
发送 Connection: Close
或 forbids further use of the connection:
$client->setOptions(['forbid_reuse' => true, … ]);
有什么方法可以在请求之间使用 HTTP 持久连接? 我没有看到 CURL 扩展有办法创建所有请求都使用的连接池,就像 mysql、redis、pg.
的其他扩展一样据我所知,您只能在同一个请求中使用持久性 http 连接。
西尔维
在HTTP中有keep-alive和流水线的概念。 Keep-Alive 允许一个 TCP 连接用于多个 HTTP 请求和响应。这允许浏览器在一个 TCP 连接上加载网页及其所有资源(例如图像、脚本等),从而避免了连接设置和拆除开销。 CURL 默认使用此 ,将 Connection: keep-alive
附加到 header。服务器配置为最大请求数以及连接将保持打开状态的时间。但它仍然以请求-响应模式运行。
通过流水线,可以在收到响应之前发出多个请求。流水线没有广泛实施,客户端和服务器都必须实施它才能工作。要在 CURL 中使用,您必须找到一个为您的客户端实现它的库(那里有一些),并且服务器也必须再次利用它。
如果您不确定您的 CURL 应用程序是否正在发送 keep-alive header,请使用 http 代理或数据包嗅探器来检查您的流量。
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 请求。
TCP 连接将保持活动状态,直到 PHP 模块关闭或直到 $client
发送 Connection: Close
或 forbids further use of the connection:
$client->setOptions(['forbid_reuse' => true, … ]);