Persistent/keepalive HTTP with the PHP Curl library?

2022-08-30 09:11:56

我正在使用一个简单的PHP库通过HTTP将文档添加到SOLR索引中。

目前涉及 3 台服务器:

  1. 运行索引作业的 PHP 框
  2. 保存正在编制索引的数据的数据库框
  3. 索拉盒子。

在 80 个文档/秒(在 100 万个文档中)时,我注意到 PHP 和 solr box 上的网络接口上的中断速率异常高(2000/秒;更重要的是,图形几乎相同 - 当 PHP 框上的中断速率峰值时,Solr box 上的中断速率也会达到峰值),但在数据库框(300/秒)上则更少。我想这仅仅是因为我打开并重用了与数据库服务器的单个连接,但是由于Solr客户端库的编写方式,每个Solr请求目前都通过cURL打开一个新的HTTP连接。

所以,我的问题是:

  1. 是否可以使 cURL 打开保持活动状态的会话?
  2. 重用连接需要什么?-- 它是否像重用 cURL 句柄资源一样简单?
  3. 我是否需要设置任何特殊的 cURL 选项?(例如,强制 HTTP 1.1?
  4. cURL保持连接有什么陷阱吗?此脚本一次运行数小时;我可以使用单个连接,还是需要定期重新连接?

答案 1

cURL PHP文档(curl_setopt)说:

CURLOPT_FORBID_REUSE - TRUE以强制连接在完成处理后显式关闭,并且不进行池化以重用。

所以:

  1. 是的,实际上它应该默认重用连接,只要您重用 cURL 句柄即可。
  2. 默认情况下,cURL 自行处理持久连接;如果您需要一些特殊的标头,请检查CURLOPT_HTTPHEADER
  3. 服务器可能会发送保持活动超时(使用默认的Apache安装,它是15秒或100个请求,以先到者为准) - 但是当发生这种情况时,cURL只会打开另一个连接。

答案 2

默认情况下,Curl 会发送保持活动状态标头,但是:

  1. 创建不带任何参数的上下文。curl_init()
  2. 将上下文存储在它将生存的范围内(而不是本地 var)
  3. 使用选项将 url 传递到上下文CURLOPT_URL
  4. 使用以下命令执行请求curl_exec()
  5. 不要关闭连接curl_close()

非常基本的例子:

function get($url) {
    global $context;
    curl_setopt($context, CURLOPT_URL, $url);
    return curl_exec($context);
}

$context = curl_init();
//multiple calls to get() here
curl_close($context);

推荐