【发布时间】:2015-03-22 04:59:42
【问题描述】:
我正在使用 Guzzle 使用 pool 并行(或异步)获取大量 URL:
$client = new GuzzleHttp\Client([
'base_url' => 'http://httpbin.org',
]);
$requests = [];
for ($i = 0; $i < 8; ++$i) {
$requests[] = $client->createRequest('GET', '/get');
}
$pool = new GuzzleHttp\Pool($client, $requests, [
'pool_size' => 4,
'complete' => function (GuzzleHttp\Event\CompleteEvent $event) {
var_dump($event->getRequest()->getUrl());
},
]);
$pool->wait();
var_dump(count($requests));
如果我在控制台中运行上述命令,它会显示预期的输出:
string(22) "http://httpbin.org/get"
string(22) "http://httpbin.org/get"
string(22) "http://httpbin.org/get"
string(22) "http://httpbin.org/get"
string(22) "http://httpbin.org/get"
string(22) "http://httpbin.org/get"
string(22) "http://httpbin.org/get"
string(22) "http://httpbin.org/get"
int(8)
现在,我希望能够根据某些条件向同一个池中添加额外的请求,我相信这种行为通常被称为滚动[并行]请求,但在阅读并重新-阅读我没有设法弄清楚的文档。这是我尝试过的:
$client = new GuzzleHttp\Client([
'base_url' => 'http://httpbin.org',
]);
$requests = [];
for ($i = 0; $i < 8; ++$i) {
$requests[] = $client->createRequest('GET', '/get');
}
$i = 0;
$pool = new GuzzleHttp\Pool($client, $requests, [
'pool_size' => 4,
'complete' => function (GuzzleHttp\Event\CompleteEvent $event) use (&$i, $client, &$requests) {
var_dump($event->getRequest()->getUrl());
if (++$i % 3 == 0) {
$requests[] = $client->createRequest('GET', '/ip');
}
},
]);
$pool->wait();
var_dump(count($requests));
对/get 的每第三个请求都应该向/ip 添加一个新请求,$requests 数组实际上正在增长(达到 10 个元素,而不是预期的 11 个元素),但这些请求从未真正执行。有没有办法让 Guzzle 池执行初始化后请求?
【问题讨论】:
-
发现 github.com/guzzle/guzzle/issues/946 涉及同一问题。看来是不可能了。