Guzzle 6.3异步池:是否从已实现的Promise回调中更新池请求列表?

时间:2019-05-04 21:12:50

标签: php asynchronous guzzle

我正在一个有 Queue 的过程中,我从一个已知的工作单元开始。当我处理工作单元时,将导致零个或多个(未知)工作单元被添加到 Queue 中。我继续处理队列,直到没有其他工作可以执行。

我正在使用Guzzle进行概念验证,在这里我接受第一个URL为队列添加种子,然后处理可能的响应正文导致需要处理的网址更多。我的目标是将它们添加到队列中,并让Guzzle继续处理它们,直到队列中没有剩余。

在其他情况下,我可以将变量定义为队列,并将其按引用传递给函数,以便使用新工作对其进行更新。但是对于Guzzle异步池(我认为是处理此问题的最有效方法),似乎没有明确的方法可以在进程中更新队列并使池执行请求。

Guzzle是否提供内置方法来从已完成的 Promise 回调内部更新Pool请求列表?

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

// Re-usable callback which prints the URL being requested
function onStats(TransferStats $stats) {
    echo sprintf(
        '%s (%s)' . PHP_EOL,
        $stats->getEffectiveUri(),
        $stats->getTransferTime()
    );
}

// The queue of work to be performed
$requests = new ArrayIterator([
    $client->get('http://httpbin.org/anything', [
        'on_stats' => 'onStats',
    ])
]);

// Process the queue, which results in more work to be performed
$p = (new EachPromise($requests, [
    'concurrency' => 50,
    'fulfilled'   => function(ResponseInterface $response) use ($client, &$requests) {
        $hash = bin2hex(random_bytes(10));
        $requests[] = $client->get(sprintf('http://httpbin.org/anything/%s', $hash), [
            'on_stats' => 'onStats',
        ]);
    },
    'rejected' => function($reason) {
        echo $reason . PHP_EOL;
    },
]))->promise();

// Wait for everything to finish
$p->wait(true);

我的问题似乎与Incrementally add requests to a Guzzle 5.0 Pool (Rolling Requests)类似,但不同之处在于它们指的是Guzzle的不同主要版本。

1 个答案:

答案 0 :(得分:1)

发布此内容后,我能够进行更多搜索,并发现了更多SO线程和Guzzle的GitHub问题。我找到了这个库,看来可以解决这个问题。

https://github.com/alexeyshockov/guzzle-dynamic-pool