64

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

目前涉及3台服务器:

  1. 运行索引作业的 PHP 框
  2. 保存被索引数据的数据库框
  3. 溶胶盒。

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

所以,我的问题是:

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

4 回答 4

58

cURL PHP 文档 ( curl_setopt ) 说:

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

所以:

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

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

  1. curl_init()使用不带任何参数创建上下文。
  2. 将上下文存储在可以生存的范围内(不是本地变量)
  3. 使用CURLOPT_URL选项将 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);
于 2012-04-10T13:32:57.710 回答
15
  1. 在您访问的服务器上,必须启用 keep-alive,并且最大 keep-alive 请求应该是合理的。对于 Apache,请参阅apache 文档

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

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

    curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array(
        'Connection: Keep-Alive',
        'Keep-Alive: 300'
    ));
    
于 2009-11-17T01:25:45.430 回答
1

如果您不关心请求的响应,您可以异步执行它们,但是您冒着使 SOLR 索引过载的风险。不过我对此表示怀疑,SOLR 非常快。

异步 PHP 调用?

于 2009-06-10T00:36:53.633 回答