使用 PHP Curl 库持久/保持 HTTP?

发布于 2024-07-24 03:07:19 字数 620 浏览 9 评论 0原文

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

当前涉及 3 个服务器:

  1. 运行索引作业的 PHP 框
  2. 保存正在索引的数据的数据库框
  3. solr 框。

在 80 个文档/秒(100 万个文档中)的情况下,我注意到 PHP 和 solr 盒子上的网络接口的中断率异常高(2000 个/秒;更重要的是,图表几乎相同 - 当中断PHP 框上的速率达到峰值,Solr 框上的速率也达到峰值),但数据库框上的速率要低得多(300/秒)。 我想这只是因为我打开并重用了与数据库服务器的单个连接,但由于 Solr 客户端库的编写方式,每个 Solr 请求当前都通过 cURL 打开一个新的 HTTP 连接。

所以,我的问题是:

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

I'm using a simple PHP library to add documents to a SOLR index, via HTTP.

There are 3 servers involved, currently:

  1. The PHP box running the indexing job
  2. A database box holding the data being indexed
  3. The solr box.

At 80 documents/sec (out of 1 million docs), I'm noticing an unusually high interrupt rate on the network interfaces on the PHP and solr boxes (2000/sec; what's more, the graphs are nearly identical -- when the interrupt rate on the PHP box spikes, it also spikes on the Solr box), but much less so on the database box (300/sec). I imagine this is simply because I open and reuse a single connection to the database server, but every single Solr request is currently opening a new HTTP connection via cURL, thanks to the way the Solr client library is written.

So, my question is:

  1. Can cURL be made to open a keepalive session?
  2. What does it take to reuse a connection? -- is it as simple as reusing the cURL handle resource?
  3. Do I need to set any special cURL options? (e.g. force HTTP 1.1?)
  4. Are there any gotchas with cURL keepalive connections? This script runs for hours at a time; will I be able to use a single connection, or will I need to periodically reconnect?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

牵你手 2024-07-31 03:07:19

cURL PHP 文档 (curl_setopt) 说:

CURLOPT_FORBID_REUSE - TRUE 强制
要显式关闭的连接
当它完成处理时,并且
不能集中再利用。

所以:

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

cURL PHP documentation (curl_setopt) says:

CURLOPT_FORBID_REUSE - TRUE to force
the connection to explicitly close
when it has finished processing, and
not be pooled for reuse.

So:

  1. Yes, actually it should re-use connections by default, as long as you re-use the cURL handle.
  2. by default, cURL handles persistent connections by itself; should you need some special headers, check CURLOPT_HTTPHEADER
  3. the server may send a keep-alive timeout (with default Apache install, it is 15 seconds or 100 requests, whichever comes first) - but cURL will just open another connection when that happens.
寄居人 2024-07-31 03:07:19

默认情况下,Curl 发送 keep-alive 标头,但是:

  1. 使用不带任何参数的 curl_init() 创建上下文。
  2. 将上下文存储在它将生存的范围内(不是本地变量)
  3. 使用 CURLOPT_URL 选项将 url 传递到上下文
  4. 使用 curl_exec() 执行请求
  5. 不要使用 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);

Curl sends the keep-alive header by default, but:

  1. create a context using curl_init() without any parameters.
  2. store the context in a scope where it will survive (not a local var)
  3. use CURLOPT_URL option to pass the url to the context
  4. execute the request using curl_exec()
  5. don't close the connection with curl_close()

very basic example:

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);
鼻尖触碰 2024-07-31 03:07:19
  1. 在您访问的服务器上,必须启用保持活动状态,并且最大保持活动请求数应该合理。 对于 Apache,请参阅 apache 文档

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

  3. 配置 cURL 上下文时,在标头中启用保持活动状态并超时:

    curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array( 
          '连接:保持活动', 
          “保持活动:300” 
      )); 
      
  1. On the server you are accessing keep-alive must be enabled and maximum keep-alive requests should be reasonable. In the case of Apache, refer to the apache docs.

  2. You have to be re-using the same cURL context.

  3. When configuring the cURL context, enable keep-alive with timeout in the header:

    curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array(
        'Connection: Keep-Alive',
        'Keep-Alive: 300'
    ));
    
苏别ゝ 2024-07-31 03:07:19

如果您不关心请求的响应,则可以异步执行它们,但您会面临 SOLR 索引超载的风险。 但我对此表示怀疑,SOLR 的速度相当快。

异步 PHP 调用?

If you don't care about the response from the request, you can do them asynchronously, but you run the risk of overloading your SOLR index. I doubt it though, SOLR is pretty damn quick.

Asynchronous PHP calls?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文