Ограничить время соединения с помощью HTTP-клиента Guzzle HTTP

Я использую Guzzle, чтобы открыть список URL-адресов и получить заголовки. Некоторые из URL-адресов слишком долго реагируют и не могут быть открыты, и я хочу игнорировать их. Это займет у меня до 20 + секунд, прежде чем Guzzle выбрасывает исключение, и я хочу изменить это и ограничить время для подключения до 2 секунд. У меня есть этот код, но он по-прежнему занимает гораздо больше времени:

<?php include 'vendor/autoload.php'; $start = new \DateTime("now"); $start = $start->format("dmY H:i:s"); echo $start."\n"; $client = new Guzzle\Http\Client(); Guzzle\Http\StaticClient::mount(); try { $request = $client->get('http://takestoolongexample', [], ['connect_timeout' => 2, 'timeout' => 3, 'debug' => true]); $response = $request->send(); var_dump($response->getStatusCode()); } catch (Exception $e) { echo "\n".$e->getMessage()."\n"; } $end = new \DateTime("now"); $end = $end->format("dmY H:i:s"); echo "\n".$end."\n"; ?> 

Вот пример результата. Как вы можете видеть, это заняло 13 секунд.

 $ php test.php 30.12.2013 22:00:07 * getaddrinfo(3) failed for takestoolongexample:80 * Couldn't resolve host 'takestoolongexample' * Closing connection 0 [curl] 6: Couldn't resolve host 'http://takestoolongexample' http://takestoolongexample 30.12.2013 22:00:20 

( http://takestoolongexample был настоящим url, изменил его здесь)

Вот обновленное решение этой проблемы для версии Guzzle (Guzzle 4).

 $request = $client->get(sprintf("%s/noisesize.api", $this->noiseConfig->url), array( 'timeout' => 5, // Response timeout 'connect_timeout' => 5, // Connection timeout )); 

Guzzle\Http\Exception\RequestException

Документация для последней версии находится здесь: Параметры запроса Guzzle – connect_timeout , тайм-аут .

Единственный способ, которым я знаю, как это сделать в Гузле:

 $params = array( 'command.request_options' = array( 'timeout' => 5, 'connect_timeout' => 2 ) ); $client = new Client(); $description = ServiceDescription::factory('/path/to/service/description/file'); $client->setDescription($description); $command = $client->getCommand('commandName', $params); $command->prepare(); $client->execute($command); 

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

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

 $client = new Guzzle\Http\Client('', array( 'request.options' => array ( 'timeout' => 6, 'connect_timeout' => 6 ) )); 

Он будет действителен для всех запросов, сделанных от этого Клиента

Ваш пример правильный, но он всегда будет терпеть неудачу.

Ошибка происходит на уровне cURL, а не на Guzzle. Перед отправкой HTTP-запроса (задание Гозлла) вам необходимо установить соответствующий сеанс IP (cURL). Чтобы получить сеанс IP, передача DNS должна произойти до отправки пакетов.

В вашем примере разрешение DNS не работает. Это происходит в коде cURL, а не в Guzzle. Таким образом, ваше значение тайм-аута не будет использоваться.

Если у вас все еще есть эта ошибка с вашим реальным URL-адресом, вы можете добавить перед вашим запросом жужжания тест, который будет проверять, разрешен ли DNS. Или вы можете определить следующий параметр cURL: CURLOPT_CONNECTTIMEOUT или CURLOPT_CONNECTTIMEOUT_MS (см. http://php.net/manual/en/function.curl-setopt.php)

Установить время ожидания DNS для использования до использования guzzle client

 putenv('RES_OPTIONS=retrans:1 retry:1 timeout:1 attempts:1'); //dns resolve params $request = $client->get(sprintf("%s/noisesize.api", $this->noiseConfig->url), array( 'timeout' => 5, // Response timeout 'connect_timeout' => 5, // Connection timeout ));