【问题标题】:Can I use curl_multi_init on the same api with different parameters?我可以在具有不同参数的同一个 api 上使用 curl_multi_init 吗?
【发布时间】:2016-05-04 20:47:53
【问题描述】:

所以我连接到https://genderize.io/ API。我想尽可能快地从这个 API 中抓取数据,因为我可能需要一次进行 1,000,000 次搜索。是否可以附加 100,000 个(每个请求 10 个名称)具有不同参数的不同 curl_init 标头,然后并行执行它们?如果可以的话,这似乎好得令人难以置信。另外,如果我不能这样做,我还能如何加快请求速度。我当前的代码使用 curl_init 的一个实例,并在 for 循环中更改每个循环的 URL。这是我当前的循环:

$ch3 = curl_init();
for($x = 0; $x < $loopnumber; $x = $x + 10){
    $test3 = curl_setopt_array($ch3, array(
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_URL => 'https://api.genderize.io?name[0]=' . $firstnames[$x] . '&name[1]=' . $firstnames[$x+1] . '&name[2]=' . $firstnames[$x+2] . '&name[3]=' . $firstnames[$x+3] . '&name[4]=' . $firstnames[$x+4] . '&name[5]=' . $firstnames[$x+5] . '&name[6]=' . $firstnames[$x+6] . '&name[7]=' . $firstnames[$x+7] . '&name[8]=' . $firstnames[$x+8] . '&name[9]=' . $firstnames[$x+9]
    ));
    $resp3 = curl_exec($ch3);
    echo $resp3;
    $genderresponse = json_decode($resp3,true);

【问题讨论】:

  • "API 是免费的,但限制为每天 1000 个名称。" "API 被限制为每个请求最多 10 个名称"
  • curl_multi_* 可能会有所帮助,但我猜真正的瓶颈在于 API。如果你一次给他们打了几十万个电话,它可能不会为你节省太多时间。你必须自己测试才能看到。
  • @Dagon 我明白了,我要为这项服务付费,每天获得 1000 多个名字。我想知道我是否并行请求每个请求是否可以有 10 个名称并允许同时执行。
  • 你可以测试一下就知道了。

标签: php api curl libcurl curl-multi


【解决方案1】:

TL;DR

是的,理论上是可能的。但是不,它在实践中行不通。您最好保持在数百个并行连接范围内。

更长的故事

在创建一百万个简单句柄并将它们添加到 libcurl 多句柄之前,您可能会用完套接字和内存。

如果您打算与单个相同的远程 IP 和端口号进行通信,并且您只有一个本地 IP 地址,并且由于每个连接都需要自己的本地端口号,那么您不能并行执行超过 64K 的理论连接。在大多数默认配置的操作系统上,您甚至无法达到 64K。 (如果您与更多远程 IP 通话或有更多本地 IP 来绑定连接,您可以做更多事情。)

为了这个论点,如果我们假设您实际上获得了多达 60K 的同时连接,那么您会发现 curl_multi_* API 具有如此多的连接,因为它是基于选择/轮询的。 libcurl 本身有一个基于事件的 API,当您超过几百个并行连接时,推荐使用它,但在 PHP 中您无法访问或使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 2016-03-20
    • 1970-01-01
    相关资源
    最近更新 更多