Я использую curl_multi_exec() для получения данных из некоторых API-интерфейсов и используя следующий код:
$startTime = microtime(true);
$running = null;
do
{
curl_multi_exec ( $curlMultiHandleResource, $running );
usleep(50000);
}
while ( $running > 0 );
$runningTime = microtime(true)-$startTime;
и я установил CURLOPT_TIMEOUT_MS = 1800 и CURLOPT_CONNECTTIMEOUT_MS = 1800. На моей машине Windows $ runTime всегда около 1,8 с или меньше, но на машине Linux иногда бывает даже больше 2,5 секунд. Поэтому я хотел знать, почему это занимает больше времени, чем CURLOPT_TIMEOUT_MS?
EDIT: Я немного сузил проблему. Я повторил время, проведенное в вызове curl_multi_exec(), и обнаружил, что каждый раз во второй итерации цикла while он занимает больше времени, чем обычно. Обычно он принимает 10 ^ -3 до 10 ^ -5 секунд, но на второй итерации он занимает от 0,5 до 1,5 секунд.
После многого поиска я обнаружил, что AsynchDNS не был включен на моей машине Linux, и, следовательно, он последовательно разрешал домены в URL-адресах и, следовательно, занимал много времени. После обновления библиотеки libcurl до 7.21.7 и включения AsynchDNS она работала должным образом.
fork()
или аналогичный внутри? Если это так, тайм-аут начинается только после того, как новый процесс его проанализирует и применит. В этом случае время ожидания не будет включать время запуска нового процесса.