有了Guzzle,承诺能提供任何实用的功能吗?看来你必须调用wait()。以下代码(来自文档)似乎本身没有任何作用:
$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
$promise->then(
function (ResponseInterface $res) {
echo $res->getStatusCode() . "\n";
},
function (RequestException $e) {
echo $e->getMessage() . "\n";
echo $e->getRequest()->getMethod();
}
);
如果你必须拨打$ promise-> wait()来发出请求,那么承诺的重点是什么?这与真的有什么不同:
$request = new Request('GET', 'http://httpbin.org/get');
$response = $client->send($request);
if ($response
我能说的最好,唯一的好处是它定义请求成功和失败回调的便捷方法。甚至关于发出多个请求的doc部分也有下面的代码,它似乎阻止并执行所有请求......也许是在同一时间"。这是我应该期待的吗?
// Wait on all of the requests to complete.
$results = Promise\unwrap($promises);
答案 0 :(得分:11)
我在这里走出困境,但是从我读过的......
虽然PHP无法进行异步处理,但可以打开多个流并处理其输入而不会阻塞。所以在你的单一连接示例中,是的,没有任何意义/好处。
但是,假设你想加载5个资源。使用异步方法可以使这些资源基本上并行加载 - 而不是仅在第一个加载时启动第二个。
Guzzle提供了处理用例的方法,例如“在他们全部正确加载之后......”或“在他们全部加载或失败之后......”。
所以我认为在处理可能同时发生的多个请求时应该能够加快处理速度。
答案 1 :(得分:3)
异步需要一些反思。
以下是可能出现的可能有用的方案: 给定一个API(http://ipsum.org/),您需要将一个数据列表(通过id)返回到您的路由(或脚本) - 如果您按程序执行,则必须遍历每个请求并等待它一切都回来了。
使用Guzzle Promise,您可以“准备”响应,然后当它返回时 - 您可以处理它。这样做的好处是,为了执行你的脚本而不是N请求xT请求时间,延迟现在是CEIL(收到的所有响应的最慢响应时间),因为你“等待”所有响应回来但它们是而是以并行方式发送。
换句话说,您正在以并行方式而不是串行方式发送请求,以便等待响应返回或者您可以先预先执行curl调用,然后在我等待返回时进行设置“ok ,让我准备回应“。
后面的部分将需要进行一些重组,因为我们习惯于“去取,等待,然后回复,我们可以对响应进行操作”