使用PHP Curl库的持久/ keepalive HTTP?

时间:2009-06-09 22:59:49

标签: php http curl libcurl keep-alive

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

目前涉及3台服务器:

  1. 运行索引作业的PHP框
  2. 包含索引数据的数据库框
  3. solr box。
  4. 每秒80个文档(100万个文档中),我注意到PHP和solr盒子上的网络接口上的异常高的中断率(2000 /秒;而且,图表几乎相同 - 当PHP盒子上的中断率达到峰值时,它也会出现在Solr盒子上,但在数据库盒子上却少得多(300 /秒)。我想这只是因为我打开并重用了一个到数据库服务器的连接,但是每个Solr请求当前都是通过cURL打开一个新的HTTP连接,这要归功于Solr客户端库的编写方式。

    所以,我的问题是:

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

4 个答案:

答案 0 :(得分:52)

cURL PHP文档(curl_setopt)说:

  

CURLOPT_FORBID_REUSE - TRUE强迫   明确关闭的连接   当它完成处理,和   不要合并重用。

所以:

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

答案 1 :(得分:21)

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

  1. 使用curl_init()创建一个没有任何参数的上下文。
  2. 将上下文存储在它将存活的范围内(不是本地var)
  3. 使用CURLOPT_URL选项将网址传递给上下文
  4. 使用curl_exec()
  5. 执行请求
  6. 请勿关闭与curl_close()
  7. 的关联

    非常基本的例子:

    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);
    

答案 2 :(得分:14)

  1. 在您正在访问的服务器上,必须启用keep-alive,并且最大保持活动请求应该是合理的。对于Apache,请参阅apache docs

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

  3. 配置cURL上下文时,在标题中启用keep-alive with timeout:

    curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array(
        'Connection: Keep-Alive',
        'Keep-Alive: 300'
    ));
    

答案 3 :(得分:1)

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

Asynchronous PHP calls?