使用Guzzle承诺异步

时间:2016-05-23 15:33:02

标签: php asynchronous promise guzzle

我正在尝试使用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等待响应。实际发生的是承诺1次火灾,等待5秒然后点燃承诺2并等待另外5秒。

根据我的理解,我应该使用承诺的->resolve();函数来启动它,但我不知道如何通过解析函数来进行http调用

2 个答案:

答案 0 :(得分:4)

使用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(); });
     

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

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

答案 1 :(得分:1)

这个问题有点老了,但是我看不到答案,所以我给它一个机会,也许有人会觉得有用。

您可以使用功能all($promises)

我找不到有关此功能的文档,但可以找到其实现here

此功能上方的注释如下所示:

  

给定一个诺言数组,返回一个诺言,当数组中的所有项目都满足时,该诺言就实现了。

听起来像您想要的东西,所以您可以执行以下操作:

$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)