簡體   English   中英

我可以在具有不同參數的同一個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標頭,然后並行執行它們? 如果可以的話,看起來真是太好了。 另外,如果無法執行此操作,還可以如何加快請求速度。 我當前的代碼正在使用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的爬網速度達到了基於選擇/輪詢的連接數量。 libcurl本身有一個基於事件的API,當您超越數百個並行連接時,建議使用它,但是從PHP內無法訪問或使用該API。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM