Использование 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.
CURLOPT_CONNECTTIMEOUT
или CURLOPT_CONNECTTIMEOUT_MS
определяют максимальное время, которое CURL может предпринять для подключения к серверу, но в вашем случае соединение успешно завершено, поэтому тайм-аут больше не применяется.
Вам нужно использовать CURLOPT_TIMEOUT
или CURLOPT_TIMEOUT_MS
которые определяют максимальный период времени, в течение которого cURL может выполнить.
Полный список опций, поддерживаемых PHP, смотрите в документации curl_setopt
.
Библиотека curl выполняет системный вызов и работает независимо от php (sidenote: поэтому можно использовать многопоточность с завихрением, хотя сам php не поддерживает потоковую обработку). Поэтому, если вы сделаете вызов curl, а затем sleep (), curl все еще работает.
Кроме того, параметр таймаута – это время ожидания ожидания запроса, а не сценарий. Например, если я сделаю запрос curl на google.com, а google.com навсегда отвечает, параметр тайм-аута позволяет мне рассказать, как долго сидеть и ждать ответа google.com.
редактировать:
Хорошо, поэтому вы говорите, что у вас есть скрипт curl, который делает запрос на другой скрипт, и этот скрипт имеет в нем sleep (). Хорошо, ну, параметр curl CURLOPT_CONNECTTIMEOUT (или _MS) должен сказать curl, как долго ждать ответа от запрошенного сервера – как и в случае с соединением. Когда запрос curl сделан, он получает ответ, что соединение было сделано … тогда sleep () просто задерживает вывод, который он дает. Таким образом, в основном, «ждать ответа» – это не то же самое, что «как долго заканчивать выполнение завитка»,
То, что вы хотите использовать, – CURLOPT_TIMEOUT или CURLOPT_TIMEOUT_MS
Ну, у меня была такая же проблема, и я потратил столько времени на поиски решения и нашел рабочее решение в конце.
Хотя я должен поделиться им здесь, и это может быть полезно для кого-то в будущем.
Я просто использовал оба варианта. Я использовал 4 секунды и 8 секунд соответственно.
curl_setopt($curl_session, CURLOPT_CONNECTTIMEOUT, 4); curl_setopt($curl_session, CURLOPT_TIMEOUT, 8);