guzzleで非同期リクエストを並列処理でいっぱい投げる

方法その1

use GuzzleHttp\Client;
use GuzzleHttp\Promise;

$client = new Client([
    'base_uri' = 'https://sample.com/',
]);

// /test1,/test2,/test3に非同期でgetを投げる
$promises[] = $client->getAsync('/test1');
$promises[] = $client->getAsync('/test2');
$promises[] = $client->getAsync('/test3');

//それぞれのリクエストの終了を待つ
$results = Promise\unwrap($promises);

方法その2(不特定数のリクエストを送るときに使う)

use GuzzleHttp\Pool;
use GuzzleHttp\Promise;
use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request;

$client = new Client([
    'base_uri' = 'https://sample.com/'
]);

// /test1,/test2,/test3, ...へのリクエストを生成するジェネレータ
$requests = function($total){
    for($i = 1; $i < $total + 1; $i++){
        yield new Request('GET', '/test' + $i);
    }
};

// 100個のリクエストを設定
$pool = new Pool($client, $requests(100), [
    'concurrency' => 5, //並列数
    'fulfilled' => function($response, $index){
        // 成功したリクエストのコールバック処理
    },
    'rejected' => function($reason, $index){
        // 失敗したリクエストのコールバック処理
    },
]);

// リクエストを投げる
$promise = $pool->promise();

// 全てのリクエストの終了を待つ
$promise->wait();