今回は、並列処理の世界への入り口となる curl_multi_init() 関数について詳しく解説していきます。
curl_multi_init() とは?
curl_multi_init() 関数は、cURL マルチハンドルセッションを初期化するための PHP 関数です。この関数を使用することで、複数の cURL 転送を並列に実行するための準備が整います。
基本的な使い方
curl_multi_init() 関数の基本的な構文は非常にシンプルです:
resource curl_multi_init ( void )
この関数は引数を取らず、新しい cURL マルチハンドルリソースを返します。
使用例
実際に curl_multi_init() を使用する例を見てみましょう:
// 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_init() の特徴
- リソース作成:新しい cURL マルチハンドルリソースを作成します。
- 並列処理の基盤:複数の cURL ハンドルを管理するための基盤を提供します。
- メモリ効率:個別の cURL セッションを作成するよりも効率的です。
プロのテクニック
- エラーチェック:
$mh = curl_multi_init();
if ($mh === false) {
die('cURL マルチハンドルの初期化に失敗しました');
}
リソース管理:
function create_multi_handle() {
static $mh = null;
if ($mh === null) {
$mh = curl_multi_init();
}
return $mh;
}
オプション設定:
curl_multi_setopt($mh, CURLMOPT_MAXCONNECTS, 10);
注意点
- リソース解放:使用後は必ず curl_multi_close() でリソースを解放しましょう。
- 再利用:一度閉じたマルチハンドルは再利用できません。新しい処理には新しいマルチハンドルを作成してください。
- PHP バージョン:PHP 5.5.0 以降で利用可能です。
まとめ
curl_multi_init() 関数は、PHP で並列 HTTP リクエストを実行するための第一歩です。この関数を使いこなすことで、複数のリクエストを効率的に処理し、アプリケーションのパフォーマンスを大幅に向上させることができます。
並列リクエストの世界への扉を開き、高速で効率的な PHP アプリケーションの新たな可能性を探求しましょう!