24

使用 Guzzle,promise 是否提供任何真正的效用?看来你必须调用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

尽我所能,唯一的好处是它是定义请求成功和失败回调的便捷方法。甚至关于发出多个请求的文档部分也有下面的代码,它似乎阻止并执行所有请求......也许在“同时”。这就是我应该期待的吗?

// Wait on all of the requests to complete.
$results = Promise\unwrap($promises);
4

2 回答 2

14

我要在这里冒险,但从我所读到的...

虽然 PHP 不能进行异步处理,但您可以打开多个流并处理它们的输入而不会阻塞。因此,在您使用单个连接的示例中,是的,没有任何意义/好处。

但是,假设您想加载 5 个资源。使用异步方法可以使这些资源基本上并行加载 - 而不是在第一个加载时才启动第二个。

Guzzle 提供了处理用例的方法,例如“在它们全部正确加载之后……”或“在它们全部加载或失败之后……”。

所以我认为在处理可能同时发生的多个请求时,它应该能够更快地处理。

于 2016-04-21T16:57:30.663 回答
4

异步需要一些逆向思考。

这是一个可能出现的可能有用的场景:给定一个 API ( http://ipsum.org/ ),您需要 (通过 id) 将数据列表返回到您的路由 (或脚本) - 如果您这样做它是程序性的,您将不得不遍历每个请求并等待它全部返回。

使用 Guzzle Promise,您可以“准备”响应,然后在它返回时 - 您可以处理它。这样做的好处是,当您“等待”所有响应返回时,延迟现在是 CEIL(收到的所有响应的最慢响应时间)而不是 N 请求 x T 请求时间而是并行发送。

换句话说,您正在并行发送请求而不是串行发送请求,这样您就可以等待返回的响应,或者您可以先预先执行 curl 调用,然后进行设置以“确定,我在等待返回,让我准备回应”。

后面的部分将需要一些重组,因为我们习惯于“去获取,等待,然后有回复,我们可以对回复进行操作”

于 2016-05-17T16:28:03.163 回答