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调用。
通过使用,wait()
您将强制同步解决承诺:https : //github.com/guzzle/promises#synchronous-wait
根据Guzzle常见问题解答,您应该requestAsync()
在RESTful调用中使用:
Guzzle可以发送异步请求吗?
是。您可以使用客户端的requestAsync,sendAsync,getAsync,headAsync,putAsync,postAsync,deleteAsync和patchAsync方法发送异步请求。客户端将返回GuzzleHttp \ Promise \ PromiseInterface对象。您可以将功能链接到诺言。
Run Code Online (Sandbox Code Playgroud)$promise = $client->requestAsync('GET', 'http://httpbin.org/get'); $promise->then(function ($response) { echo 'Got a response! ' . $response->getStatusCode(); });
您可以使用返回的promise的wait()方法强制完成异步响应。
Run Code Online (Sandbox Code Playgroud)$promise = $client->requestAsync('GET', 'http://httpbin.org/get'); $response = $promise->wait();
小智 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)
。