我正在使用guzzle Pool执行多个api并发请求。 一切都很好。
但是如果有任何请求响应,我想停止/避免所有请求。也就是说,我想在请求之间进行一些竞争。是否可以在laravel中使用Guzzle?
这是我到目前为止所做的事情:
$requests = function(array $urls){
foreach ($urls as $url) {
yield new Request('GET', $url);
}
};
$pool = new Pool($client,
$requests($urls),
[
'concurrency' => 5,
'fulfilled' => function($response, $index) use ($urls){
echo "<br>Completed ".$urls[$index];
},
'rejected' => function($reason, $index){
echo "Rejected ".$index;
},
]);
$promise = $pool->promise();
$promise->wait();
$ urls是一个URI数组
答案 0 :(得分:1)
我认为目前的Guzzle Pool实现不可能。您唯一能做的就是exit;
函数中的fulfilled
:
'fulfilled' => function($response, $index) use ($urls){
echo "Completed " . $urls[$index];
exit;
},
在这种情况下,它仍会发送所有请求,但会立即以最快的响应退出脚本。
如果没有游泳池,您可以使用GuzzleHttp\Promise\any或GuzzleHttp\Promise\some辅助功能:
use GuzzleHttp\Client;
use GuzzleHttp\Promise;
$client = new Client(['base_uri' => 'http://site.local/']);
// Initiate each request but do not block
$promises = [
'delay3' => $client->getAsync('/async/delay3.php'),
'delay2' => $client->getAsync('/async/delay2.php'),
'delay1' => $client->getAsync('/async/delay1.php'),
];
//Initiate a competitive race between multiple promises
$promise = Promise\any($promises)->then(
function (\GuzzleHttp\Psr7\Response $response) {
echo "Completed: " . $response->getStatusCode() . "\n";
echo $response->getBody() ."\n";
},
function ($reason) {
echo $reason;
}
);
$results = $promise->wait();
来自GuzzleHttp\Promise\some($count, $promises)
的文档:
在多个承诺或价值观之间展开激烈竞争 (价值将立即履行承诺)。
当履行承诺金额时,退回 承诺通过包含履行的数组来实现 获胜者的价值按决议顺序排列。
这个承诺被{@see拒绝 GuzzleHttp \ Promise \ AggregateException}如果满足的数量 承诺小于所需的$ count。
来自GuzzleHttp\Promise\any($promises)
的文档:
像some()一样,1为count。但是,如果承诺履行,那么 履行价值不是1的数组,而是直接的值。