【发布时间】:2010-11-01 15:45:25
【问题描述】:
我正在使用一个简单的 PHP 库通过 HTTP 将文档添加到 SOLR 索引。
目前涉及3台服务器:
- 运行索引作业的 PHP 框
- 保存被索引数据的数据库框
- solr 盒子。
在 80 个文档/秒(100 万个文档中)时,我注意到 PHP 和 solr 盒上的网络接口的中断率异常高(2000/秒;此外,图表几乎相同——当 PHP 盒上的中断率达到峰值时,Solr 盒上的中断率也会达到峰值),但数据库盒上的中断率要低得多(300/秒)。我想这仅仅是因为我打开并重用了与数据库服务器的单个连接,但由于 Solr 客户端库的编写方式,每个 Solr 请求当前都通过 cURL 打开一个新的 HTTP 连接。
所以,我的问题是:
- 可以使用 cURL 来打开 keepalive 会话吗?
- 如何重用连接? -- 是否像重用 cURL 句柄资源一样简单?
- 是否需要设置任何特殊的 cURL 选项? (例如强制 HTTP 1.1?)
- cURL keepalive 连接是否存在任何问题?该脚本一次运行数小时;我可以使用单一连接,还是需要定期重新连接?
【问题讨论】:
-
好吧,我在解析整个站点时使用了它,其中包含许多需要身份验证并始终保持会话的页面。使用初始句柄资源,您可以继续执行命令以获取页面并与客户端保持相同的会话和连接。使用命令行,这已经持续了大约 20 分钟(对于我们所有的数据要求 - 因此可以持续更长时间),无需重新连接。但是我不确定这是否是您要问的,因此这是评论而不是答案:)
-
另请注意,根据您正在执行的操作和连接的服务器,您通常需要设置一些选项。所有这些都在这里有详细记录:uk3.php.net/manual/en/function.curl-setopt.php
-
这部分常见问题解答是相关的,虽然不是很详细:curl.haxx.se/docs/faq.html#Can_I_perform_multiple_requests
-
我遇到了一个问题:在通过单个 curl 句柄发出大约 100,000 个请求后,我的脚本达到了 512 兆的内存使用量;在我开始重用连接之前,它从未超过 60 MB。我现在每 1000 个请求重新连接一次(这可能比必要的频率更高,但很少会导致连接开销应该非常小)
-
还有: CURLOPT_MAXCONNECTS - 允许的最大持久连接数。当达到限制时,CURLOPT_CLOSEPOLICY 用于确定要关闭哪个连接。
标签: php http curl libcurl keep-alive