Тайм-аут PHP cURL игнорируется - PullRequest
2 голосов
/ 23 июля 2011

Используя curl_setopt() Я установил CURLOPT_CONNECTTIMEOUT_MS на 1000 (1 секунда) и настроил другой сценарий , который спит в течение 5 секунд, затем отвечает 200 OK (используя sleep()), который я вызываюв целях тестирования.Мой сценарий всегда ожидает ответа, даже если он должен выдать ошибку тайм-аута cURL.

Как заставить тайм-аут работать так, как ожидается, и прервать запрос?

$ch = curl_init($url);
curl_setopt_array($ch, array(
  CURLOPT_RETURNTRANSFER => TRUE,
  CURLOPT_FOLLOWLOCATION => TRUE,
  CURLOPT_NOBODY => TRUE,
  CURLOPT_PROTOCOLS => CURLPROTO_HTTP | CURLPROTO_HTTPS,
  CURLOPT_CONNECTTIMEOUT_MS => 1000,
  CURLOPT_MAXREDIRS => 5,
  CURLOPT_USERAGENT => 'Linkit/2.x Drupal/7.x',
));
$document = curl_exec($ch);

У менятакже пробовал CURLOPT_TIMEOUT_MS, а также варианты без суффиксов _MS.

Я использую PHP 5.3.4 с cURL 7.19.7 на OS X 10.6, XAMPP.

Ответы [ 3 ]

11 голосов
/ 23 июля 2011

CURLOPT_CONNECTTIMEOUT или CURLOPT_CONNECTTIMEOUT_MS определяют максимальное время, которое cURL может занять для подключения к серверу, но в вашем случае соединение установлено успешно, поэтому время ожидания больше не применяется.

Вам необходимо использовать CURLOPT_TIMEOUT или CURLOPT_TIMEOUT_MS, которые определяют максимальное количество времени, которое может выполнять cURL.

Для получения полного списка опций, поддерживаемых PHP, посмотрите curl_setopt документация .

3 голосов
/ 23 июля 2011

Библиотека curl выполняет системный вызов и работает независимо от php (sidenote: поэтому можно использовать многопоточность с помощью curl, даже если сам php не поддерживает многопоточность).Поэтому, если вы делаете вызов curl, а затем sleep (), curl по-прежнему выполняется.

Кроме того, настройка тайм-аута - это время ожидания истечения времени ожидания запроса, а не сценария.Например, если я сделаю запрос скручивания на google.com и google.com будет отвечать вечно, настройка тайм-аута позволяет мне указать скручиваемость, как долго сидеть и ждать, пока google.com ответит.

edit:

Итак, вы говорите, что у вас есть скрипт curl, который делает запрос к другому скрипту, и в этом скрипте есть sleep ().Хорошо, хорошо, параметр curl CURLOPT_CONNECTTIMEOUT (или _MS) должен указывать curl, как долго ждать ответа от запрошенного сервера - например, при установлении соединения.Когда запрос curl сделан, он получает ответ, что соединение было установлено ... тогда sleep () просто задерживает вывод, который он дает.Таким образом, в основном, «ждать ответа» - это не то же самое, что «как долго прервать выполнение curl»

То, что вы хотите использовать, это CURLOPT_TIMEOUT или CURLOPT_TIMEOUT_MS

2 голосов
/ 28 июня 2012

Ну, у меня была та же проблема, и я потратил столько времени на поиски решения и в конце нашел рабочее решение.

Я бы хотел поделиться этим здесь, и это может пригодиться кому-то в будущем.

Я просто использовал оба варианта. Я использовал 4 секунды и 8 секунд соответственно.

curl_setopt($curl_session, CURLOPT_CONNECTTIMEOUT, 4);
curl_setopt($curl_session, CURLOPT_TIMEOUT, 8);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...