持久性/ keepalive HTTP与PHP Curl库?

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

目前涉及3台服务器:

  1. 运行索引工作的PHP框
  2. 一个数据库框,其中包含要建立索引的数据
  3. solr框。

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

所以,我的问题是:

  1. 可以使用cURL打开一个keepalive会话吗?
  2. 重用连接需要什么? -是否像重用cURL句柄资源一样简单?
  3. 我是否需要设置任何特殊的cURL选项? (例如,强制使用HTTP 1.1?)
  4. 是否存在使用cURL keepalive连接的陷阱? 该脚本一次运行数小时; 我将能够使用单个连接,还是需要定期重新连接?
Frank Farmer asked 2019-10-09T02:37:44Z
4个解决方案
52 votes

cURL PHP文档(curl_setopt)说:

CURLOPT_FORBID_REUSE-TRUE强制   要明确关闭的连接   完成处理后,以及   不被合并以供重用。

所以:

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

Curl默认发送keep-alive标头,但是:

  1. 使用curl_close()创建没有任何参数的上下文。
  2. 将上下文存储在可以生存的范围内(而不是局部变量)
  3. 使用curl_close()选项将url传递到上下文
  4. 使用curl_close()执行请求
  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);
Richard Keizer answered 2019-10-09T02:39:35Z
14 votes
  1. 在要访问的服务器上,必须启用保持活动状态,并且最大保持活动请求应该合理。 如果是Apache,请参考apache文档。

  2. 您必须重新使用相同的cURL上下文。

  3. 在配置cURL上下文时,请在标头中启用带有超时的keep-alive:

    curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array(
        'Connection: Keep-Alive',
        'Keep-Alive: 300'
    ));
    
Oleg Barshay answered 2019-10-09T02:40:25Z
1 votes

如果您不关心请求的响应,则可以异步执行它们,但是冒着SOLR索引过载的风险。 我对此感到怀疑,但是SOLR真的很快。

异步PHP调用?

Brent answered 2019-10-09T02:40:58Z
translate from https://stackoverflow.com:/questions/972925/persistent-keepalive-http-with-the-php-curl-library