Как установить таймаут на вызовы PHP5 curl? Опубликованные параметры CURL не работают
Мы написали скрипт, который извлекает данные с внешнего сервера. Если сервер выходит из строя, мы не хотим, чтобы наш сервер ждал данных, поскольку мы обрабатываем большое количество данных и не хотим, чтобы они зависали. Чтобы решить эту проблему, мы пытаемся тайм-аут наших вызовов curl, если они занимают более пары сотен миллисекунд.
Я обнаружил некоторую документацию, в которой говорится, что CURLOPT_TIMEOUT_MS и CURLOPT_CONNECTTIMEOUT_MS должны быть доступны в моей версии php и libcurl, но, похоже, время не истекает, даже если для тайм-аута установлено значение 1 мс.
$url = "http://www.cnn.com;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER,0); //Change this to a 1 to return headers
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 1);
$data = curl_exec($ch);
curl_close($ch);
Кто-нибудь знает, что мы делаем неправильно или другой способ сделать это?
1 ответ
Видел это в не отвечает на DNS-сервер и curl multi таймауты не работает:
"... У нас были случаи, когда на сайте, который мы извлекали информацию, сервер DNS не отвечал. Когда это происходит, тайм-ауты, заданные в curl (привязки php), не работают должным образом. Время ожидания истекает через 1 мин 14 с" Не удалось разрешить хост: www.yahoo.com (доменное имя не найдено) "Чтобы это произошло в тестовой среде, мы изменим /etc/resolv.conf, чтобы иметь несуществующий сервер имен (сервер имен 1.1.1.1). они установлены на
(CURLOPT_CONNECTTIMEOUT, CURLOPT_CONNECTTIMEOUT_MS , CURLOPT_TIMEOUT, CURLOPT_TIMEOUT_MS)
они не останавливаются, когда мы не можем добраться до DNS-сервера. Я использую curl_multi, потому что у нас есть несколько источников, из которых мы извлекаем информацию одновременно. Пример ниже делает один вызов для примера простоты. И как примечание стороны, curl_errno не возвращает код ошибки, даже если была ошибка. Не уверен почему...