我可以在具有不同参数的相同 api 上使用 curl_multi_init 吗?
Can I use curl_multi_init on the same api with different parameters?
所以我连接到 https://genderize.io/ API。我想尽快从这个 API 中抓取,因为我可能需要一次进行 1,000,000 次搜索。是否可以附加 100,000(每个请求 10 个名称)不同的 curl_init headers 和不同的参数,然后并行执行它们?如果可以的话,这似乎太好了,难以置信。另外,如果我不能这样做,我还能如何加快请求速度。我当前的代码使用 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);
TL;DR
是的,这是可能的 - 理论上。但不,它在实践中行不通。你最好保持在几百个并行连接内。
更长的故事
在创建一百万个简单句柄并将它们添加到 libcurl 多句柄之前,您可能 运行 会用尽套接字和内存。
如果您打算与单个相同的远程 IP 和端口号进行通信,并且您只有一个本地 IP 地址,并且由于每个连接都需要其自己的本地端口号,您不能同时进行超过 64K 的理论上的连接.在大多数默认配置的操作系统上,您甚至达不到 64K。 (如果您与更多远程 IP 通话或有更多本地 IP 绑定连接,您可以做更多事情。)
为了这个论点,如果我们假设您实际上获得了 60K 个同时连接,那么您会发现 curl_multi_* API 达到了爬行速度许多连接,因为它是基于 select/poll 的。 libcurl 本身有一个基于事件的 API,当你超过几百个并行连接时推荐使用它,但在 PHP 内你无法访问或使用它。
所以我连接到 https://genderize.io/ API。我想尽快从这个 API 中抓取,因为我可能需要一次进行 1,000,000 次搜索。是否可以附加 100,000(每个请求 10 个名称)不同的 curl_init headers 和不同的参数,然后并行执行它们?如果可以的话,这似乎太好了,难以置信。另外,如果我不能这样做,我还能如何加快请求速度。我当前的代码使用 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);
TL;DR
是的,这是可能的 - 理论上。但不,它在实践中行不通。你最好保持在几百个并行连接内。
更长的故事
在创建一百万个简单句柄并将它们添加到 libcurl 多句柄之前,您可能 运行 会用尽套接字和内存。
如果您打算与单个相同的远程 IP 和端口号进行通信,并且您只有一个本地 IP 地址,并且由于每个连接都需要其自己的本地端口号,您不能同时进行超过 64K 的理论上的连接.在大多数默认配置的操作系统上,您甚至达不到 64K。 (如果您与更多远程 IP 通话或有更多本地 IP 绑定连接,您可以做更多事情。)
为了这个论点,如果我们假设您实际上获得了 60K 个同时连接,那么您会发现 curl_multi_* API 达到了爬行速度许多连接,因为它是基于 select/poll 的。 libcurl 本身有一个基于事件的 API,当你超过几百个并行连接时推荐使用它,但在 PHP 内你无法访问或使用它。