2016-04-01 1 views
2

私はこのような同時要求を送信するためにがつがつ食う6を使用しています:グーグルを使用してタイムアウト制限付きの同時リクエストを送信するにはどうすればよいですか?

public function sendConcurrentRequests() { 

    $client = new Client(['timeout' => 5]); 

    $promises[] = $client->getAsync('http://example.com/1'); 
    $promises[] = $client->getAsync('http://example.com/2'); 
    $promises[] = $client->getAsync('http://example.com/3'); 

    $results = Promise\unwrap($promises); 

    return $results; 
} 

各要求は、1から10秒にどこでも取ることができるが、私は要求のいずれかが5秒以上待ちたくありません(そのため、私はタイムアウトを設定しています)。私は起こるだろう願っています、このです:

  • 要求1、2及び3は、要求がキャンセルされるように要求2は、5秒以上かかり
  • 開始され、リクエスト1および3からの応答、その「2をリクエスト3秒以上かかりますので、アンラップ機能がConnectExceptionをスローし、私ができる - を - 1、2と3をリクエスト を開始している:時間に、

を返される。これは、実際に何が起こっているかで答えましたリクエスト1とリクエスト3からの応答を取得します。

時間内に返されたリクエストから有効な回答を得るために、この作業を行うにはどうすればよいですか?

答えて

3

私は質問を書くのを終える前に答えを見つけましたが、他人を助ける場合にはまだ投稿すると思いました。あなたができるように、

$results = Promise\settle($promises)->wait(true);

settle機能の約束が拒否された場合に例外をスローしません。これにより

$results = Promise\unwrap($promises);

ソリューションは、この呼び出しを置き換えることでした完全な応答配列を取得します(満たされた応答と拒否された応答の両方)。

+0

別の例との相違点の説明を探している人のために:http://docs.guzzlephp.org/en/latest/quickstart.html?highlight=promise#concurrent-requests –

+1

この機能は、質問が投稿されたので、私はそれをドキュメントに追加しました:D https://github.com/guzzle/guzzle/commit/812f3a83e5de84a089369ce07452fa9d45d2dd1d – kenske

関連する問題