在Guzzle中池之间的比赛

时间:2018-03-25 09:28:16

标签: guzzle guzzle6

我正在使用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数组

1 个答案:

答案 0 :(得分:1)

我认为目前的Guzzle Pool实现不可能。您唯一能做的就是exit;函数中的fulfilled

'fulfilled' => function($response, $index) use ($urls){
    echo "Completed " . $urls[$index];
    exit;
 },

在这种情况下,它仍会发送所有请求,但会立即以最快的响应退出脚本。

如果没有游泳池,您可以使用GuzzleHttp\Promise\anyGuzzleHttp\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的数组,而是直接的值。