2016-03-21 14 views
16

Guzzleでは、実際のユーティリティを提供する約束はありますか? コールウェイティング()である必要があります。 (ドキュメントから)次のコード自体が何もしないようだ:Guzzle async promiseのポイントは何ですか?

$promise = $client->requestAsync('GET', 'http://httpbin.org/get'); 
$promise->then(
    function (ResponseInterface $res) { 
     echo $res->getStatusCode() . "\n"; 
    }, 
    function (RequestException $e) { 
     echo $e->getMessage() . "\n"; 
     echo $e->getRequest()->getMethod(); 
    } 
); 

あなたは>リクエストをするために)(待つ$プロミスを呼び出す必要がある場合は、約束のポイントは何ですか?どのようにこれはより何が違うのは本当にです:

$request = new Request('GET', 'http://httpbin.org/get'); 
$response = $client->send($request); 

if ($response 

私が言うことができる最高の、唯一の利点は、要求の成功と失敗のコールバックを定義するために便利な方法ですです。複数のリクエストを作成する場合のdocセクションでも、以下のコードがあります。これは、すべてのリクエストをブロックして実行するように思われます。これは私が期待すべきものですか?

// Wait on all of the requests to complete. 
$results = Promise\unwrap($promises); 
+1

「当時答えを、私たちは応答に動作することができ、待って、フェッチ行く」ために使用されているので、後の部分は、いくつかのリストラが必要になりますが、繰延処理と全く同義非同期(async)ですか? –

+0

良い質問とおそらくそうではありません。本当に私はそれの約束の部分でもっと混乱しています。 – originalbryan

+0

私はPHPが本当に非同期のイベントハンドリング(まだ)が可能であるとは思わないので、 'wait()'を呼び出すことができます。だから、Javascriptで見られるメリットのいくつかはPHPのバージョン(まだ)では明白ではないという真理があるかもしれませんが、約束の目的はあなたが "読み取り専用"のようなインターフェースそのインタフェースを介して解決できない遅延に変換します。おそらくこれは後方互換性のためです(今のところ)。 –

答えて

8

私はPHPが非同期処理を行うことはできませんが、しかし、

...私が読んだからここに手足にオープンいくつかのストリームをあなたができ外出して対処していますその入力はブロックされません。だからあなたの例では、単一の接続で、はい、ポイント/利点はありません。

ただし、5つのリソースを読み込みたいとします。非同期メソッドを使用すると、これらのリソースを本質的に並列にロードすることができます.1つ目がロードされたときに2番目のリソースを開始するだけでなく、

Guzzleは、「すべてが正しくロードされた後...」や「ロード済みか失敗したのか」などのユースケースを処理する方法を提供します。

だから、同時に発生する可能性のある複数のリクエストを処理する場合には、より高速な処理が可能になるはずです。

1

非同期には逆の考えが少し必要です。

有用な可能性があるシナリオを次に示します。 API(http://ipsum.org/)を指定すると、経路(またはスクリプト)にデータのリストを戻す必要があります。あなたは各リクエストをループして、すべてが戻ってくるまで待つ必要があります。

Guzzle Promiseを使用すると、レスポンスを「準備」して戻ってきたときに処理することができます。これの利点は、あなたのスクリプトを実行するためにN要求x Tの要求時間の代わりに、すべての応答が戻って来るのを待つときに待ち時間がCEIL(すべての応答の最も遅い応答時間)になったことです。 Parallelで送信されます。

言い換えれば、シリアルではなくパラレルでリクエストを送信するので、応答が復帰するまで待つか、最初にcurlコールを事前に実行してから、「ok返す、私は応答を準備させてください "。

我々は

関連する問題