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

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

<?php
include 'vendor/autoload.php';

$start = new \DateTime("now");

$start = $start->format("d.m.Y 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("d.m.Y 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 был реальным адресом, изменил его здесь)


person user3147578    schedule 30.12.2013    source источник


Ответы (5)


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

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

Выбрасывает Guzzle\Http\Exception\RequestException

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

person phpisuber01    schedule 10.11.2014

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

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

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

person Axi    schedule 06.11.2015
comment
Вы также можете установить параметры непосредственно в качестве первого параметра - new \GuzzleHttp\Client(['timeout' => 6, 'connect_timeout' => 6]); github.com/guzzle/guzzle/blob/master/docs/ - person toster-cx; 23.05.2019

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

$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);

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

person Radu Murzea    schedule 30.12.2013

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

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

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

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

person Pierre-Yves Gillier    schedule 30.12.2013

Установите тайм-аут разрешения DNS перед использованием клиента guzzle

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
));
person user3665895    schedule 18.10.2016