Так что я подключаюсь к 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);
Да, это возможно — в теории. Но нет, на практике это не сработает. Вам лучше оставаться в пределах нескольких сотен параллельных соединений.
Вероятно, у вас закончатся сокеты и, возможно, память, прежде чем вы сможете создать миллион простых дескрипторов и добавить их в мульти-дескриптор libcurl.
Если вы намереваетесь обмениваться данными с одним и тем же удаленным IP-адресом и номером порта, и у вас есть только один локальный IP-адрес, и поскольку каждому соединению требуется свой собственный номер локального порта, вы не можете выполнять более 64K теоретических соединений параллельно. Вы даже не получите 64 КБ в большинстве настроенных операционных систем по умолчанию. (Вы можете сделать больше, если говорите с большим количеством удаленных IP-адресов или имеете больше локальных IP-адресов для привязки соединений.)
Ради этого аргумента, если мы предположим, что вы на самом деле получаете до 60 Кбайт одновременных соединений, то вы обнаружите, что API curl_multi_ * достигает скорости сканирования с таким количеством соединений, поскольку оно основано на выборе / опросе. В самой libcurl есть API, основанный на событиях, который рекомендуется, когда вы выходите за рамки нескольких сотен параллельных соединений, но изнутри PHP вы не можете ни получить, ни использовать его.
Других решений пока нет …