Я использую 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 ));