[英]Using Guzzle promises asyncronously
我試圖使用guzzle promises來進行一些 http 調用,為了說明我所擁有的,我做了這個簡單的例子,其中一個假的 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);
現在我想做的是啟動它們,然后讓兩個 echo 等待響應。 實際發生的是 promise 1 觸發,等待 5 秒,然后觸發 promise 2 並再等待 5 秒。
根據我的理解,我也許應該使用->resolve();
promise 的 function 使其啟動,但我不知道如何通過解析 function,我會在其中撥打 http
通過使用wait()
您可以強制同步解析承諾: 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)
函數all($promises)
。
我找不到有關此功能的文檔,但您可以在此處找到它的實現。
此函數上方的注釋如下所示:
給定一系列承諾,返回在滿足數組中所有項目時滿足的承諾。
聽起來像你在尋找,所以你可以做這樣的事情:
$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)
。
您可以使用 function Utils::all($promises)->wait();
這是“guzzlehttp/promises”的代碼示例:“^1.4”
$promises = [];
$key = 0;
foreach(something...) {
$key++;
$promises[$key] = new Promise(
function() use (&$promises, $key) {
// here you can call some sort of async operation
// ...
// at the end call ->resolve method
$promises[$key]->resolve('bingo');
}
);
}
$res = Utils::all($promises)->wait();
如果要獲得並發工作流,重要的是您在 promise 中的操作必須是非阻塞的。 例如,sleep(1) 是阻塞操作。 因此,10 個 sleep(1) 承諾 - 無論如何都會等待 10 秒。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.