2015-01-05 4 views
18

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

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

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

+2

Там также CURLOPT_TIMEOUT_MS. Я не уверен, что произойдет, когда определены как CURLOPT_TIMEOUT_MS, так и CURLOPT_TIMEOUT. Я думаю, нужно определить одну из двух. –

+0

@SandeepanNath Из [CURL docs для CURLOPT_TIMEOUT] (https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html) указано, что: «Если установлены оба параметра CURLOPT_TIMEOUT и CURLOPT_TIMEOUT_MS, последнее значение будет используемый." – MrWhite

ответ

27

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

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

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

От Difference between CURLOPT_CONNECTTIMEOUT and CURLOPT_TIMEOUT

+6

Я бы сказал, это не совсем правильно. [Здесь] (https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html) он говорит, что 'CURLOPT_TIMEOUT' определяет максимальное время в секундах, в течение которого вы разрешаете операцию передачи libcurl. *" , Это немного неоднозначно. Мой опыт, похоже, подтверждает ответ Милоша ниже: 'CURLOPT_CONNECTTIMEOUT' на самом деле просто для фазы подключения *, а' CURLOPT_TIMEOUT' - для фазы передачи *. Оба добавленных определяют полный тайм-аут 'curl_exec()'. –

+0

Чтобы это было ясно, позвольте мне добавить к этому объяснению. CURL_CONNECTIONTIMEOUT - это максимальное время, в течение которого вы можете сохранить соединение, когда вы уже подключаетесь. В то время как CURL_TIMEOUT - это максимальное время, которое вы можете попробовать от начала до конца, когда соединение не может быть установлено. –

18

CURLOPT_CONNECTTIMEOUT не отрезок времени, представленного CURLOPT_TIMEOUT

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

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

+0

Думаю, я могу это подтвердить. Я настроил 'CURLOPT_TIMEOUT' на' 4' и оставил 'CURLOPT_CONNECTTIMEOUT' нетронутым. У меня также есть PHP медленный журнал, настроенный для запросов, занимающих> 10 с. Мой скрипт PHP подключается к удаленному сайту, а медленный журнал часто сообщает о проблемах с 'curl_exec()', занимающим более 10 секунд. Я бы предположил, что он ограничен «4» из руководства. –

+1

Вы видели это [комментарий] (http://www.altafweb.com/2012/12/difference-between-curloptconnecttimeou.html?showComment=1458056670978#c2865373137896441937)? – Sebastian

3

В дополнение к accepted answer.

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

/* 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; 

Unit tests для источника

Смежные вопросы