簡體   English   中英

異步使用 Guzzle promises

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM