Я использую 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 $ runningTime всегда составляет около 1,8 с или меньше, но на машине с Linux это иногда оказывается даже больше, чем 2,5 с.
Поэтому я хотел бы знать, почему это занимает больше времени, чем CURLOPT_TIMEOUT_MS?
РЕДАКТИРОВАТЬ: Я несколько сузил проблему. Я повторил время, затраченное на вызов curl_multi_exec (), и обнаружил, что каждый раз во второй итерации цикла while это занимает больше времени, чем обычно. Обычно это занимает от 10 ^ -3 до 10 ^ -5 секунд, но во второй итерации это занимает от 0,5 до 1,5 секунд.
После долгих поисков я обнаружил, что AsynchDNS не был включен на моей машине с Linux и, следовательно, он последовательно разрешал домены в URL и, следовательно, занимал много времени. После обновления моей библиотеки libcurl до 7.21.7 и включения AsynchDNS она работала как положено.
Других решений пока нет …