2010-11-19 6 views
4

Я выполняю запрос на завивки страницы. Я установил оба значения «CURLOPT_TIMEOUT» (до 6 секунд) и «CURLOPT_CONNECTTIMEOUT» (до 4 секунд), и оба они отлично работают для большинства URL-адресов.Как изменить тайм-аут curl php, когда curl пытается разрешить хост (curl err_no 6)

Однако, если веб-страница не отвечает (и, наконец, вызывает CURL через ошибку «Не удалось разрешить хост» (err_no 6)) - кажется, что «CURLOPT_TIMEOUT» не имеет эффекта, и завиток будет ждать, возможно, неопределенно или пока не истечет какой-то «другой» тайм-аут.

С URL я пытаюсь получить доступ, CURL всегда, кажется, принимает почти ровно 15 секунд, прежде чем он возвращается (который не имеет ничего общего с «CURLOPT_TIMEOUT» или «CURLOPT_CONNECTTIMEOUT».

Может кто-нибудь сказать мне, как я могу ограничить количество времени CURL затрачивает пытается решить множество

ответ

3

Ну у вас есть 3 таймаут на руках там

  1. CURLOPT_TIMEOUT -. как долго вся операция принимает
  2. CURLOPT_CONNECTTIMEOUT - как долго Curl ждет хозяина, чтобы ответить на его запрос
  3. Поиск DNS Timeout - , что вы испытываете, запрос DNS терпит неудачу и занимает определенное время сделать это

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

+0

Fantastic! Я посмотрю, как это можно сделать, попробуйте, спасибо! –

+0

Это не будет особенно легко, поскольку DNS - это синхронное дело, как правило, которое блокирует процесс. Существует «adns» (http://www.chiark.greenend.org.uk/~ian/adns/) - который обеспечивает асинхронный поиск, он старый, но функциональный. Вероятно, достаточно легко вызвать dig или nslookup извне и убить процесс, если он занимает слишком много времени, но это приводит к накладным расходам. Если вы можете использовать pcntl_fork(), вы можете запустить новый поток, чтобы сделать это, или использовать pcntl_alarm(), чтобы выйти из блокировки раньше. – Orbling

0

Фактически, CURLOPT_CONNECTTIMEOUT включает время запроса DNS. Протестировано в php 5.4.9.

1

изменение DNS решительность таймаут перед использованием Curl

putenv('RES_OPTIONS=retrans:1 retry:1 timeout:1 attempts:1'); 
Смежные вопросы