16

Guzzle を使用して URL のリストを開き、ヘッダーを取得しています。一部の 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 でしたが、ここで変更しました)

4

5 に答える 5

33

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_timeout , timeout .

于 2014-11-10T14:18:22.777 に答える
8

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

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

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

于 2015-11-06T11:17:29.507 に答える
0

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

エラーは 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を参照)

于 2013-12-30T21:28:36.860 に答える
0

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
));
于 2016-10-18T08:14:57.050 に答える