Guzzle异步承诺的意义何在



有了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

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

// Wait on all of the requests to complete.
$results = Promiseunwrap($promises);

我在这里四肢着地,但从我读到的内容来看......

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

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

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

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

异步

需要一些反向思维。

以下是可能出现的可能有用的场景:给定一个 API (http://ipsum.org/),您需要将数据列表(按 id 返回)到您的路由(或脚本) - 如果您按程序执行,则必须遍历每个请求并等待它全部返回。

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

换句话说,您正在并行而不是串行中发送请求,以便等待响应返回,或者您可以先预先执行 curl 调用,然后进行设置以"好的,当我等待返回时,让我准备响应"。

后面的部分需要一些重组,因为我们习惯于"去获取,等待,然后得到答案,我们可以对响应进行操作"

最新更新