我正在一个有 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的不同主要版本。
答案 0 :(得分:1)
发布此内容后,我能够进行更多搜索,并发现了更多SO线程和Guzzle的GitHub问题。我找到了这个库,看来可以解决这个问题。