[PHP]curl_multi_exec() 関数:並列リクエストの指揮者

PHP

今回は、cURL マルチハンドリングの中心的な役割を果たす curl_multi_exec() 関数について詳しく解説していきます。

curl_multi_exec() とは?

curl_multi_exec() 関数は、cURL マルチハンドルに追加された複数の cURL ハンドルを並列に実行するための PHP 関数です。この関数は、非同期な I/O 処理を行い、複数のリクエストを効率的に処理します。

基本的な使い方

curl_multi_exec() 関数の基本的な構文は以下の通りです:

int curl_multi_exec ( resource $mh , int &$still_running )
  • $mh: cURL マルチハンドル
  • $still_running: まだ実行中のサブリクエストの数を格納する変数(参照渡し)

使用例

実際に curl_multi_exec() を使用する例を見てみましょう:

// cURL マルチハンドルを初期化
$mh = curl_multi_init();

// 複数の URL を設定
$urls = [
    'https://api.example.com/data1',
    'https://api.example.com/data2',
    'https://api.example.com/data3'
];

$channels = [];

// 各 URL に対して cURL ハンドルを作成し、マルチハンドルに追加
foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($mh, $ch);
    $channels[] = $ch;
}

// リクエストを実行
$active = null;
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}

// 結果を取得
foreach ($channels as $ch) {
    $result = curl_multi_getcontent($ch);
    echo "結果: " . $result . "\n";
    curl_multi_remove_handle($mh, $ch);
}

// マルチハンドルを閉じる
curl_multi_close($mh);

curl_multi_exec() の特徴

  1. 非ブロッキング:I/O 操作を非ブロッキングで行うため、効率的な並列処理が可能です。
  2. 状態管理:実行中のリクエスト数を追跡し、すべての処理が完了したかどうかを判断できます。
  3. 柔軟性:curl_multi_select() と組み合わせることで、タイムアウト処理も実装できます。

プロのテクニック

  1. エラーハンドリング:
if ($mrc !== CURLM_OK) {
    throw new Exception("curl_multi_exec failed: $mrc");
}

タイムアウト設定:

$timeout = 1.0; // 1秒
curl_multi_select($mh, $timeout);

進捗状況の表示:

echo "実行中のリクエスト: $active\n";

注意点

  • リソース使用:多数のリクエストを同時に実行すると、システムリソースを大量に消費する可能性があります。
  • エラー処理:個々の cURL ハンドルのエラーを適切に処理することが重要です。
  • ループ制御:無限ループに陥らないよう、適切な終了条件を設定してください。

まとめ

curl_multi_exec() 関数は、PHP で複数の HTTP リクエストを効率的に並列処理するための強力なツールです。適切に使用することで、アプリケーションのパフォーマンスを大幅に向上させることができます。

並列リクエストの指揮者として curl_multi_exec() を使いこなし、高速で効率的な PHP アプリケーションを構築しましょう!

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