Могу ли я использовать curl_multi_init на одном API с разными параметрами?

Так что я подключаюсь к https://genderize.io/ API. Я хочу убрать этот API как можно быстрее, потому что мне может потребоваться выполнить 1 000 000 поисков за раз. Можно ли присоединить 100 000 (10 имен на запрос) разных заголовков curl_init с разными параметрами, а затем выполнить их все параллельно? Это кажется слишком хорошим, чтобы быть правдой, если бы я мог. Также, если я не могу сделать это, как еще я могу ускорить запросы. Мой текущий код использует один экземпляр curl_init и изменяет URL для каждого цикла в цикле for. Вот мой текущий цикл:

$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);

0

Решение

Да, это возможно — в теории. Но нет, на практике это не сработает. Вам лучше оставаться в пределах нескольких сотен параллельных соединений.

Вероятно, у вас закончатся сокеты и, возможно, память, прежде чем вы сможете создать миллион простых дескрипторов и добавить их в мульти-дескриптор libcurl.

Если вы намереваетесь обмениваться данными с одним и тем же удаленным IP-адресом и номером порта, и у вас есть только один локальный IP-адрес, и поскольку каждому соединению требуется свой собственный номер локального порта, вы не можете выполнять более 64K теоретических соединений параллельно. Вы даже не получите 64 КБ в большинстве настроенных операционных систем по умолчанию. (Вы можете сделать больше, если говорите с большим количеством удаленных IP-адресов или имеете больше локальных IP-адресов для привязки соединений.)

Ради этого аргумента, если мы предположим, что вы на самом деле получаете до 60 Кбайт одновременных соединений, то вы обнаружите, что API curl_multi_ * достигает скорости сканирования с таким количеством соединений, поскольку оно основано на выборе / опросе. В самой libcurl есть API, основанный на событиях, который рекомендуется, когда вы выходите за рамки нескольких сотен параллельных соединений, но изнутри PHP вы не можете ни получить, ни использовать его.

0

Другие решения

Других решений пока нет …