【Laravel】Guzzleで並列の非同期リクエストを送ってみた

Laravelの実務において、Guzzleを使って並列で非同期リクエストを送る実装があったので、ご紹介します。

環境

  • PHP7.3
  • Laravel5.5(古くてごめんなさい)
  • Guzzle6.3
use GuzzleHttp\Pool;
use GuzzleHttp\Client;

$client = new Client();

//$urlListにリクエストを送るurlを代入します。
$urlList = [];

$requests = function ($urlLsit) use ($client) {
    foreach ($urlLsit as $url) {
        yield function() use ($client, $url) {
            //$client->getAsync($url)でリクエストを生成
            return $client->requestAsync('GET', $url);
        };
    }
};

$contents = [];

$pool = new Pool($client, $requests($urlLsit), [
    //同時リクエスト数を決める
    'concurrency' => 10, 
    //成功時の処理
    'fulfilled' => function ($response, $index) use ($urlLsit, &$contents) {
        $contents[$urlLsit[$index]] = [
        'html'             => $response->getBody()->getContents(),
        'status_code'      => $response->getStatusCode(),
        'response_header'  => $response->getHeaders()
        ];
    },
    //失敗時の処理
    'rejected' => function ($reason, $index) use ($urlLsit, &$contents) {
        // this is delivered each failed request
        $contents[$urlLsit[$index]] = [
        'html'   => '',
        'reason' => $reason
        ];
    },
]);

$promise = $pool->promise();

//全ての並列処理が終わるまで待機
$promise->wait();

Guzzleの公式ドキュメントはこちら

以上、Guzzleを使って、並列で非同期リクエストを投げる実装をご紹介しました。

コメント

タイトルとURLをコピーしました