繁体   English   中英

php和持久HTTP连接

[英]php and persistent HTTP connections

有什么方法可以在请求之间使用HTTP持久连接? 我没有看到CURL扩展具有创建所有请求都使用的连接池的方法,就像mysql,redis和pg的其他扩展一样。

从我所看到的,您只能在同一请求内使用持久性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禁止进一步使用该连接为止:

$client->setOptions(['forbid_reuse' => true, … ]);

在HTTP中,有保持活动和流水线的概念。 保持活动状态允许跨多个HTTP请求和响应使用一个TCP连接。 这样一来,浏览器就可以通过一个TCP连接将网页的所有资源(例如图像,脚本等)加载到网页上,从而避免了连接设置和操作开销。 默认情况下CURL使用此方法 ,将Connection: keep-alive附加到标头。 为服务器配置了最大请求数以及连接将保持打开状态的时间。 但是它仍然以请求-响应模式运行。

通过管道传输,可以在收到响应之前发出多个请求。 流水线没有广泛实现,并且要使客户端和服务器都能工作,流水线必须实现。 要在CURL中使用,您必须找到一个库(那里有一些库)可以为您的客户端实现该库,服务器也必须再次使用它。

如果不确定CURL应用程序是否正在发送keep-alive标头,请使用http代理或数据包嗅探器检查您的流量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM