web-dev-qa-db-ja.com

Guzzle HTTPとの接続時間を制限するPHPクライアント

私はGuzzleを使用してurl-sのリストを開き、ヘッダーを取得しています。一部のURLは応答に時間がかかりすぎて開くことができず、無視したいと思います。 Guzzleが例外をスローするまでに最大20秒かかります。これを変更して、接続時間を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は実際のURLでした。ここで変更しました)

14
user3147578

これは、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 request options - connect_timeouttimeout

24
phpisuber01

精度が低く、クライアントコンストラクターでタイムアウトを定義することもできます

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

このクライアントからのすべてのリクエストに有効です

8
Axi

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のドキュメントは非常に良いように見えますが、私はそれが貧弱で混乱し、不完全だと思います。ですから、私にとって、コードが実際に正しいのか、それが機能するのかを理解するのは困難です。

3
Radu Murzea

Guzzleクライアントを使用する前にDNS解決タイムアウトを設定する

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
));
0
user3665895

あなたの例は正しいですが、常に失敗します。

エラーはGuzzleではなく、cURLレベルで発生しています。 HTTPリクエスト(Guzzleのジョブ)を送信する前に、関連するIPセッション(cURLのセッション)を確立する必要があります。 IPセッションを取得するには、パケットが送信される前にDNS変換が行われる必要があります。

あなたの例では、DNS解決は失敗しています。 Guzzleではなく、cURLコードで発生しています。したがって、タイムアウト値は使用されません。

実際のURLでこのエラーが引き続き発生する場合は、guzzleリクエストの前に、DNSが解決されているかどうかを確認するテストを追加できます。または、次のcURLオプションを定義することもできます:CURLOPT_CONNECTTIMEOUTまたはCURLOPT_CONNECTTIMEOUT_MS( http://php.net/manual/en/function.curl-setopt.php を参照)

0