Я использую «переходящую» реализацию 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 минут ожидания.
У меня еще есть проверка / проверка, но, возможно, это может вызвать звонок с кем-то.
После долгих испытаний, я считаю, что нашел то, что вызывает эту конкретную проблему. Я не говорю, что другой ответ неверен, просто в этом случае не проблема, которую я испытываю.
Из того, что я могу сказать, 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
Если это так, вы должны следить за своими завитушками для тайм-аутов и удалять их из нескольких пулов.