今回は、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() の特徴
- 非ブロッキング:I/O 操作を非ブロッキングで行うため、効率的な並列処理が可能です。
- 状態管理:実行中のリクエスト数を追跡し、すべての処理が完了したかどうかを判断できます。
- 柔軟性:curl_multi_select() と組み合わせることで、タイムアウト処理も実装できます。
プロのテクニック
- エラーハンドリング:
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 アプリケーションを構築しましょう!