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を使って、並列で非同期リクエストを投げる実装をご紹介しました。
コメント