我正在处理一个有队列的过程,我从一个已知的工作单元开始。当我处理工作单元时,它将导致零或多个(未知)工作单元被添加到队列中。我继续处理队列,直到没有更多的工作要执行。
我正在用口香糖做一个概念的证明,在这里我接受第一个URL作为队列的种子,然后处理响应的主体,这可能会导致更多需要处理的URL。我的目标是将它们添加到队列中,并让Guzzle继续处理它们,直到队列中什么都没有了。
在其他情况下,我可以将变量定义为队列,并通过引用将其传递到函数中,以便使用新的工作对其进行更新。但是对于GUSOS异步池(我认为这是处理这个问题的最有效的方法),似乎没有一种清晰的方法来更新进程中的队列并让Pool执行请求。
Guzzle是否提供了一种内置的方法,用于从履行承诺的回调中更新池请求列表?
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),但不同之处在于它们指的是不同主要版本的口香糖。
发布于 2019-05-04 13:56:24
在发布这篇文章之后,我能够做更多的搜索,并找到了更多的SO线程和GitHub问题。我找到了这个图书馆,它似乎解决了这个问题。
https://stackoverflow.com/questions/55986841
复制