异步使用Guzzle Promise

Ric*_*ich 6 php asynchronous promise guzzle

我试图使用食人鱼的承诺来进行一些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);
Run Code Online (Sandbox Code Playgroud)

现在,我想做的是同时启动它们,然后使两个echo都在等待响应。实际发生的情况是承诺1触发,等待5秒钟,然后触发承诺2,再等待5秒钟。

根据我的理解,我也许应该使用->resolve();一个promise函数来启动它,但是我不知道如何通过resolve函数来进行http调用。

Dig*_*ris 6

通过使用,wait()您将强制同步解决承诺:https : //github.com/guzzle/promises#synchronous-wait

根据Guzzle常见问题解答,您应该requestAsync()在RESTful调用中使用:

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(); });
Run Code Online (Sandbox Code Playgroud)

您可以使用返回的promise的wait()方法强制完成异步响应。

$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
$response = $promise->wait();
Run Code Online (Sandbox Code Playgroud)

  • 这不仅重述了这个问题而没有回答吗?我认为最初的问题是询问如何等待多个promise,所有promise均异步触发,因此有望以任何顺序完成。 (2认同)

小智 6

这个问题有点老了,但我没有看到答案,所以我会尝试一下,也许有人会发现它有帮助。

您可以使用该功能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);
Run Code Online (Sandbox Code Playgroud)

如果此函数不能帮助您解决问题,则该文件中还有其他有趣的函数,例如some($count, $promises),any($promises)settle($promises)