web-dev-qa-db-ja.com

Guzzleを使用すると、非同期で約束します

私はいくつかのhttp呼び出しを行うために guzzle promises を使用しようとしています。私が持っているものを説明するために、偽のhttp要求が5秒かかるこの簡単な例を作成しました。

_$then = microtime(true);

$promise = new Promise(
    function() use (&$promise) {
        //Make a request to an http server
        $httpResponse = 200;
        sleep(5);
        $promise->resolve($httpResponse);
    });

$promise2 = new Promise(
    function() use (&$promise2) {
        //Make a request to an http server
        $httpResponse = 200;
        sleep(5);
        $promise2->resolve($httpResponse);
    });

echo 'PROMISE_1 ' . $promise->wait();
echo 'PROMISE_2 ' . $promise2->wait();

echo 'Took: ' . (microtime(true) - $then);
_

今、私がやりたいのは、両方を開始してから、両方のエコーを応答を待機させることです。実際に発生するのは、promise 1が起動し、5秒間待機してから、promise 2が起動し、さらに5秒間待機することです。

私の理解では、promiseの->resolve();関数を使用して開始する必要があるかもしれませんが、http呼び出しを行う関数を渡す方法がわかりません。

6
Rich

wait()を使用すると、promiseが同期的に解決されるようになります: https://github.com/guzzle/promises#synchronous-wait

Guzzle FAQ によると、RESTful呼び出しではrequestAsync()を使用する必要があります。

Guzzleは非同期リクエストを送信できますか?

はい。クライアントのrequestAsync、sendAsync、getAsync、headAsync、putAsync、postAsync、deleteAsync、およびpatchAsyncメソッドを使用して、非同期要求を送信できます。クライアントはGuzzleHttp\Promise\PromiseInterfaceオブジェクトを返します。その後、約束から外れて機能を連鎖させることができます。

$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
$promise->then(function ($response) {
echo 'Got a response! ' . $response->getStatusCode(); });

返されたpromiseのwait()メソッドを使用して、非同期応答を強制的に完了することができます。

$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
$response = $promise->wait();
6
Digital Chris

この質問は少し古いですが、答えが見当たらないので、試してみます。誰かが役立つと思うかもしれません。

関数all($promises)を使用できます

この関数に関するドキュメントは見つかりませんが、その実装は見つかります ここ

この関数の上のコメントは次のように始まります。

一連のpromiseを指定して、配列内のすべての項目が実行されたときに実行されるpromiseを返します。

あなたが探しているもののように聞こえるので、あなたはこのようなことをすることができます:

_$then = microtime(true);
$promises = [];

$promises[] = new Promise(
    function() use (&$promise) {
        //Make a request to an http server
        $httpResponse = 200;
        sleep(5);
        $promise->resolve($httpResponse);
    });

$promises[] = new Promise(
    function() use (&$promise2) {
        //Make a request to an http server
        $httpResponse = 200;
        sleep(5);
        $promise2->resolve($httpResponse);
    });

all($promises)->wait();
echo 'Took: ' . (microtime(true) - $then);
_

この関数が問題の解決に役立つものでない場合は、そのファイルにsome($count, $promises)any($promises)settle($promises)などの他の興味深い関数があります。

1
vimuzumu