我可以在具有不同参数的相同api上使用curl_multi_init吗?

时间:2016-05-04 20:47:54

标签: php api curl libcurl curl-multi

所以我要连接到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);

1 个答案:

答案 0 :(得分:0)

TL; DR

是的,理论上可行。但不,它在实践中不起作用。你最好保持几百个并行连接。

长篇故事

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

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

为了这个论点,如果我们假设您实际上最多可以获得60K的并发连接,那么您将发现curl_multi_ * API因为基于select / poll而具有许多连接的爬行速度。 libcurl本身有一个基于事件的API,当你超过几百个并行连接时,它是推荐的API,但是从PHP中你无法访问也不能使用它。