私はいくつかの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呼び出しを行う関数を渡す方法がわかりません。
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();
この質問は少し古いですが、答えが見当たらないので、試してみます。誰かが役立つと思うかもしれません。
関数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)
などの他の興味深い関数があります。