食人鱼异步多个承诺

时间:2019-04-27 19:13:47

标签: php guzzle guzzle6

因此,我正在尝试将guzzle用于几个并发请求。我在网上看到了几个示例,这是我想出的,但似乎无法使其正常工作。没有错误,没有警告,什么都没有。我已经尝试在每个诺言中登录,但是什么也没有发生。

我肯定知道什么都没发生,因为没有任何东西插入数据库。有什么想法我想念的吗? (我在产生每个请求时都带有各自的then,因为在每个承诺结束时,数据库操作都是特定于该用户的。)

use GuzzleHttp\Promise\EachPromise;
use Psr\Http\Message\ResponseInterface;

$promises = (function () use($userUrls){
    $userUrls->each(function($user) {
        yield $this->client->requestAsync('GET', $user->pivot->url)
            ->then(function (ResponseInterface $response) use ($user) {
                $this->dom->load((string)$response->getBody());
                // ... some db stuff that inserts row in table for this
                // $user with stuff from this request
            });
    });
});

$all = new EachPromise($promises, [
    'concurrency' => 4,
    'fulfilled' => function () {

    },
]);

$all->promise()->wait();

1 个答案:

答案 0 :(得分:1)

不知道您没有收到错误,但您的生成器肯定是错误的。

use Psr\Http\Message\ResponseInterface;
use function GuzzleHttp\Promise\each_limit_all;

$promises = function () use ($userUrls) {
    foreach ($userUrls as $user) {
        yield $this->client->getAsync($user->pivot->url)
            ->then(function (ResponseInterface $response) use ($user) {
                $this->dom->load((string)$response->getBody());
                // ... some db stuff that inserts row in table for this
                // $user with stuff from this request
            });
    };
};

$all = each_limit_all($promises(), 4);

$all->promise()->wait();

请注意,foreach而非$userUrls->each()很重要,因为在您的版本生成器函数中,传递给->each()调用的函数,而不是您分配给$promise的函数

还请注意,您必须激活生成器(将$promises()传递给结果,而不是将函数本身传递给Guzzle)。

否则,一切看起来都不错,尝试更改后的代码。