我正在使用一个简单的PHP库,通过HTTP将文档添加到SOLR索引中。
目前涉及3台服务器:
每秒80个文档(100万个文档中),我注意到PHP和solr盒子上的网络接口上的异常高的中断率(2000 /秒;而且,图表几乎相同 - 当PHP盒子上的中断率达到峰值时,它也会出现在Solr盒子上,但在数据库盒子上却少得多(300 /秒)。我想这只是因为我打开并重用了一个到数据库服务器的连接,但是每个Solr请求当前都是通过cURL打开一个新的HTTP连接,这要归功于Solr客户端库的编写方式。
所以,我的问题是:
答案 0 :(得分:52)
cURL PHP文档(curl_setopt)说:
CURLOPT_FORBID_REUSE
-TRUE
强迫 明确关闭的连接 当它完成处理,和 不要合并重用。
所以:
答案 1 :(得分:21)
Curl默认发送keep-alive头,但是:
curl_init()
创建一个没有任何参数的上下文。CURLOPT_URL
选项将网址传递给上下文curl_exec()
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);
答案 2 :(得分:14)
在您正在访问的服务器上,必须启用keep-alive,并且最大保持活动请求应该是合理的。对于Apache,请参阅apache docs。
您必须重新使用相同的cURL上下文。
配置cURL上下文时,在标题中启用keep-alive with timeout:
curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array(
'Connection: Keep-Alive',
'Keep-Alive: 300'
));
答案 3 :(得分:1)
如果您不关心请求的响应,可以异步执行,但是存在重载SOLR索引的风险。我对此表示怀疑,SOLR非常快。