Как установить таймаут на вызовы 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 не возвращает код ошибки, даже если была ошибка. Не уверен почему...

Другие вопросы по тегам