PHP 開発では、cURL ライブラリを使用して HTTP リクエストを行うのが一般的な方法です。プロジェクトで複数の HTTP リクエストを同時に処理する必要がある場合、curl_multi シリーズの関数を使用すると実行効率が効果的に向上します。現在アクティブな cURL 転送が完了するのを待つために、 curl_multi_select()関数を使用して、より効率的な待機メカニズムを実装できます。
<span class="fun">curl_multi_select(リソース $mh[, float $timeout])</span>
curl_multi_select()関数は、現在アクティブな cURL 転送が完了するのを待機し、読み取り可能なハンドルの数を返すために使用されます。この機能により、ネットワークの応答を待っている間もスクリプトをアクティブにしておくことができるため、全体的な実行効率が向上します。
$mh = curl_multi_init();
$ch1 = curl_init();
curl_setopt($ch1, CURLOPT_URL, "https://example.com/api/request1");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $ch1);
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, "https://example.com/api/request2");
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $ch2);
do {
$status = curl_multi_exec($mh, $active);
if ($active) {
curl_multi_select($mh); // 現在アクティブを待機中cURL転送完了
}
} while ($active && $status == CURLM_OK);
// すべてのリクエストが処理された後,閉鎖cURLハンドル
foreach ([$ch1, $ch2] as $ch) {
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
curl_multi_close($mh);
上の例では、まずcurl_multiバッチハンドルを作成し、それに2つの独立したcurlリクエストを追加しました。次に、 curl_multi_exec()を使用して転送プロセスを実行し、 curl_multi_select()関数によって現在アクティブなリクエストが完了するのを待ちます。ループは、すべてのリクエストが処理されるまで継続します。最後に、関連するハンドルをすべてクリーンアップして閉じて、システム リソースを解放します。
curl_multi_select()を使用すると、同時 HTTP リクエストの処理パフォーマンスを大幅に向上させることができます。実際の開発では、スクリプトが無限待機状態にならないように、待機期間中にタイムアウトや例外を合理的に処理することをお勧めします。さらに、 curl_multi_info_read()関数を組み合わせて各リクエストの戻りステータスを取得し、より詳細なエラー処理を行うことができます。
curl_multi_select()は、複数のリクエストを同時に処理するための PHP の重要な関数の 1 つです。これを適切に使用することで、開発者はネットワーク応答を待機している間もスクリプトをアクティブにしておくことができるため、アプリケーションの応答効率とユーザー エクスペリエンスが大幅に向上します。