我正在尝试使用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调用
答案 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)
。