与PHP Curl库持久/ Keepalive HTTP?
我正在使用一个简单的PHP库通过HTTP将文档添加到SOLR索引。
目前有3台服务器:
- 运行索引作业的PHP框
- 一个数据库框中保存的数据被索引
- Solr盒子。
在80个文档/秒(100万个文档)中,我注意到PHP和solr盒上的networking接口的中断率非常高(2000 / sec;而且graphics几乎完全相同 – 当中断速度在PHP框峰值,它也刺激Solr框),但在数据库框(300 /秒)更less。 我想这仅仅是因为我打开并重用了一个到数据库服务器的连接,但是由于Solr客户端库的写入方式,每一个Solr请求都是通过cURL打开一个新的HTTP连接。
所以,我的问题是:
- cURL可以打开Keepalive会话吗?
- 重用连接需要什么? – 和重复使用cURL句柄资源一样简单吗?
- 我需要设置任何特殊的cURL选项吗? (例如强制HTTP 1.1?)
- 有没有curl keepalive连接的陷阱? 这个脚本一次运行几个小时; 我将能够使用单个连接,还是需要定期重新连接?
cURL PHP文档( curl_setopt )说:
CURLOPT_FORBID_REUSE
– 强制连接在完成处理时强制closures,而不是合并重用。
所以:
- 是的,只要重新使用cURL句柄,实际上它应该默认重新使用连接。
- 默认情况下,cURL自己处理持久连接; 如果您需要一些特殊的标题,请检查CURLOPT_HTTPHEADER
- 服务器可能会发送一个保持活动超时(默认的Apache安装,它是15秒或100个请求,以先到者为准) – 但cURL将在这种情况发生时打开另一个连接。
Curl默认发送keep-alive头文件,但是:
- 使用
curl_init()
而不带任何参数创build一个上下文。 - 将上下文存储在它将存活的范围内(而不是本地variables)
- 使用
CURLOPT_URL
选项将URL传递给上下文 - 使用
curl_exec()
执行请求 - 不要用
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);
-
在您正在访问的服务器上,必须启用保持活动状态,并且最大保持活动状态的请求应该是合理的。 在Apache的情况下,请参阅apache文档 。
-
你必须重新使用相同的cURL上下文。
-
在configurationcURL上下文时,在头中启用超时保持活动状态:
curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array( 'Connection: Keep-Alive', 'Keep-Alive: 300' ));
如果你不关心来自请求的响应,你可以asynchronous执行它们,但是你可能会超负荷SOLR索引。 虽然我怀疑,SOLR是相当快的。
asynchronousPHP调用?