PHP cURL: CURLOPT_CONNECTTIMEOUT vs CURLOPT_TIMEOUT

PHP имеет эти два параметра, связанные с таймаутом: CURLOPT_CONNECTTIMEOUT и CURLOPT_TIMEOUT.

Описания на сайте PHP немного расплывчаты. Какая разница?

Чтобы использовать пример реального мира: скажите, что вы отправляете GET vars на URL через cURL, и хотите получить обратно XML, будет ли CURLOPT_CONNECTTIMEOUT соответствовать максимальному количеству времени, которое может потребоваться для подключения к серверу и CURLOPT_TIMEOUT максимальное время, которое может потребоваться для отправки XML обратно?

Ответ 1

CURLOPT_CONNECTTIMEOUT - это максимальный промежуток времени в секундах, который разрешен для подключения к серверу. Его можно установить в 0, чтобы отключить этот предел, но это нецелесообразно в производственной среде.

CURLOPT_TIMEOUT - это максимальное время в секундах, в течение которого выполнение отдельных вызовов функции расширения cURL будет ограничено. Обратите внимание, что значение для этого параметра должно включать значение для CURLOPT_CONNECTTIMEOUT.

Другими словами, CURLOPT_CONNECTTIMEOUT - это сегмент времени, представленный CURLOPT_TIMEOUT, поэтому значение CURLOPT_TIMEOUT должно быть больше значения CURLOPT_CONNECTTIMEOUT.

От Разница между CURLOPT_CONNECTTIMEOUT и CURLOPT_TIMEOUT

Ответ 2

CURLOPT_CONNECTTIMEOUT не сегмент времени, представленный CURLOPT_TIMEOUT

Если для CURLOPT_CONNECTTIMEOUT установлено значение 3 секунды и CURLOPT_TIMEOUT до 4 секунд, выполнение может занять до 7 секунд.

Я тестировал это, моделируя медленное соединение с сервером (падение iptables).

Ответ 3

В дополнение к принятому ответу .

В соответствии с исходный код настройки подключены: если оба установлены, используется наиболее ограничительный. Но только на стадии соединения.

/* if a timeout is set, use the most restrictive one */

  if(data->set.timeout > 0)
    timeout_set |= 1;
  if(duringconnect && (data->set.connecttimeout > 0))
    timeout_set |= 2;

  switch(timeout_set) {
  //...
  case 3:
    if(data->set.timeout < data->set.connecttimeout)
      timeout_ms = data->set.timeout;
    else
      timeout_ms = data->set.connecttimeout;
    break;

Модульные тесты для источника

Ответ 4

CURLOPT_CONNECTTIMEOUT - время подключения только к серверу.

CURLOPT_TIMEOUT - это время соединения и время обмена данными.

Итак, CURLOPT_TIMEOUT всегда включает CURLOPT_CONNECTTIMEOUT.

Чтобы убедиться, что это очень просто с помощью CURLINFO_CONNECT_TIME и CURLINFO_TOTAL_TIME.

  • curl_getinfo ($ ch, CURLINFO_CONNECT_TIME) получает информацию, а curl_setopt ($ ch, CURLOPT_CONNECTTIMEOUT, $ yourMaxConnTime) устанавливает максимальное значение для соединения.

  • curl_getinfo ($ ch, CURLINFO_TOTAL_TIME) получает информацию, а curl_setopt ($ ch, CURLOPT_TIMEOUT, $ yourMaxTotTime) устанавливает максимальное значение всей операции.

Конечно, $ yourMaxTotTime должен быть всегда выше, чем $ yourMaxConnTime. Все эти значения в секундах.

Ответ 5

Принятый ответ неверен. См. Документацию Everything CURL для правильной документации.

В основном время соединения охватывает два аспекта установления http-соединения:

  • Разрешение DNS
  • Время до установления TCP-соединения.

Этот период времени НЕ ВСЕГДА покрывается параметрами CURLOPT_TIMEOUT или CURLOPT_TIMEOUT_MS. Они охватывают все, что происходит после того, как мы начинаем говорить HTTP через TCP-соединение, которое было только что установлено на этапе соединения.

Это различие создает проблемы для многих людей, но позволяет установить относительно короткий тайм-аут соединения, потому что, если сервер полностью недоступен, зачем его ждать? Тем не менее, время ожидания запроса может быть достаточно большим, если трудно предсказать ожидаемое время ответа для службы.

Как правило, для производственных установок значение CURLOPT_CONNECTION_TIMEOUT должно быть меньше 5 секунд, а значение CURLOPT_TIMEOUT должно быть как можно ниже (без необходимости регулярно отбрасывать запросы).