cURL multi висит / игнорирует таймаут

Я использую «переходящую» реализацию cURL multi (например, этот пост SO , основанный на этом коде cURL ). Он отлично работает, чтобы обрабатывать тысячи URL-адресов, используя до 100 запросов одновременно, с 5 экземплярами сценария, работающего как демоны (да, я знаю, это должно быть написано на C или что-то еще).

Вот проблема: после обработки ~ 200 000 URL-адресов (по 5 экземплярам) curl_multi_exec() похоже, разбивается на все экземпляры сценария. Я попытался отключить скрипты, затем перезапустить, и произойдет то же самое (не после 200 000 URL-адресов, но при перезагрузке) скрипт зависает при вызове curl_multi_exec() .

Я поместил сценарий в «один» режим, обрабатывая один регулярный дескриптор cURL вовремя, и это отлично работает (но это не совсем то, что мне нужно). Мой журнал приводит меня к подозрению, что он, возможно, попал в патч медленных / проблемных подключений (поскольку каждый так часто обрабатывается по URL-адресу, а затем снова зависает), но это означает, что мой CURLOPT_TIMEOUT игнорируется для отдельных дескрипторов . Или, может быть, это просто что-то с запуском, что многие запросы через cURL.

Кто-нибудь слышал об этом?

Пример кода (опять же на основе этого ):

 //some logging shows it hangs right here, only looping a time or two //so the hang seems to be in the curl call while(($execrun = curl_multi_exec($master, $running)) == CURLM_CALL_MULTI_PERFORM); //code to check for error or process whatever returned 

У меня CURLOPT_TIMEOUT установлено значение 120 , но в случаях, когда curl_multi_exec() наконец, возвращает некоторые данные, это происходит через 10 минут ожидания.

У меня еще есть проверка / проверка, но, возможно, это может вызвать звонок с кем-то.

Solutions Collecting From Web of "cURL multi висит / игнорирует таймаут"

После долгих испытаний, я считаю, что нашел то, что вызывает эту конкретную проблему. Я не говорю, что другой ответ неверен, просто в этом случае не проблема, которую я испытываю.

Из того, что я могу сказать, curl_multi_exec() не возвращается, пока не будет разрешен весь DNS (сбой или успех). Если существует куча URL-адресов с плохими доменами, curl_multi_exec() не возвращается, по крайней мере:

 (time it takes to get resolve error) * (number of urls with bad domain) 

Вот кто-то другой, кто открыл это :

Просто примечание об асинхронном характере многофункциональных функций cURL: поиски DNS не являются (насколько я знаю сегодня) асинхронными. Поэтому, если один DNS-поиск вашей группы терпит неудачу, все в списке URL-адресов после этого также не удается. Мы фактически обновляем наш файл hosts.conf (я думаю?) Ежедневно на нашем сервере, чтобы обойти это. Он получает IP-адреса, а не ищет их. Я считаю, что он работает, но не уверен, что он изменился в cURL.

Кроме того, тестирование показывает, что cURL (по крайней мере моя версия) выполняет настройку CURLOPT_CONNECTTIMEOUT . Конечно, первый шаг многократного цикла может занять много времени, поскольку cURL ожидает, что каждый URL-адрес будет разрешен или тайм-аут.

Я думаю, что ваша проблема выпущена:

(62) CURLOPT_TIMEOUT не работает должным образом с обычными интерфейсами multi и multi_socket. Обход для приложений – это просто удалить простую ручку, как только время закончится.

См. Также: http://curl.haxx.se/bug/view.cgi?id=2501457

Если это так, вы должны следить за своими завитушками для тайм-аутов и удалять их из нескольких пулов.