与PHP Curl库持久/ Keepalive HTTP?

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

目前有3台服务器:

  1. 运行索引作业的PHP框
  2. 一个数据库框中保存的数据被索引
  3. Solr盒子。

在80个文档/秒(100万个文档)中,我注意到PHP和solr盒上的networking接口的中断率非常高(2000 / sec;而且graphics几乎完全相同 – 当中断速度在PHP框峰值,它也刺激Solr框),但在数据库框(300 /秒)更less。 我想这仅仅是因为我打开并重用了一个到数据库服务器的连接,但是由于Solr客户端库的写入方式,每一个Solr请求都是通过cURL打开一个新的HTTP连接。

所以,我的问题是:

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

cURL PHP文档( curl_setopt )说:

CURLOPT_FORBID_REUSE – 强制连接在完成处理时强制closures,而不是合并重用。

所以:

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

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

  1. 使用curl_init()而不带任何参数创build一个上下文。
  2. 将上下文存储在它将存活的范围内(而不是本地variables)
  3. 使用CURLOPT_URL选项将URL传递给上下文
  4. 使用curl_exec()执行请求
  5. 不要用curl_close()closures连接

非常基本的例子:

 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); 
  1. 在您正在访问的服务器上,必须启用保持活动状态,并且最大保持活动状态的请求应该是合理的。 在Apache的情况下,请参阅apache文档 。

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

  3. 在configurationcURL上下文时,在头中启用超时保持活动状态:

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

如果你不关心来自请求的响应,你可以asynchronous执行它们,但是你可能会超负荷SOLR索引。 虽然我怀疑,SOLR是相当快的。

asynchronousPHP调用?