今回は、並列処理の状態を詳細に把握するための強力なツール、curl_multi_info_read() 関数について詳しく解説していきます。
curl_multi_info_read() とは?
curl_multi_info_read() 関数は、cURL マルチハンドルで実行された個々の転送に関する情報を取得するための PHP 関数です。この関数を使うことで、完了したリクエストの詳細情報やエラー状態を知ることができます。
基本的な使い方
curl_multi_info_read() 関数の基本的な構文は以下の通りです:
array curl_multi_info_read ( resource $mh [, int &$msgs_in_queue = NULL ] )
- $mh: cURL マルチハンドル
- $msgs_in_queue: キュー内に残っているメッセージの数を格納する変数(オプション)
使用例
実際に curl_multi_info_read() を使用する例を見てみましょう:
// 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 ($info = curl_multi_info_read($mh)) {
if ($info['msg'] == CURLMSG_DONE) {
$ch = $info['handle'];
$error = curl_error($ch);
$result = curl_multi_getcontent($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
echo "完了したURL: " . curl_getinfo($ch, CURLINFO_EFFECTIVE_URL) . "\n";
echo "HTTPステータスコード: $httpCode\n";
if ($error) {
echo "エラー: $error\n";
} else {
echo "結果: $result\n";
}
echo "---\n";
curl_multi_remove_handle($mh, $ch);
}
}
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
// マルチハンドルを閉じる
curl_multi_close($mh);
curl_multi_info_read() の特徴
- リアルタイム情報:転送が完了したらすぐに情報を取得できます。
- 詳細な状態:各リクエストの結果コードやエラー情報を得られます。
- 柔軟な処理:完了したリクエストごとに異なる処理を行うことができます。
プロのテクニック
- エラーハンドリングの強化:
if ($info['result'] !== CURLE_OK) {
$error = curl_strerror($info['result']);
echo "cURLエラー: $error\n";
}
非同期処理との組み合わせ:
while ($info = curl_multi_info_read($mh)) {
if ($info['msg'] == CURLMSG_DONE) {
process_completed_request($info['handle']);
}
}
パフォーマンス監視:
$startTime = microtime(true);
// ... リクエスト処理 ...
$endTime = microtime(true);
echo "処理時間: " . ($endTime - $startTime) . " 秒\n";
注意点
- メモリ使用:大量のリクエストを処理する場合、メモリ使用量に注意が必要です。
- ループ制御:適切なタイミングで curl_multi_info_read() を呼び出すことが重要です。
- エラー処理:各リクエストのエラー状態を適切に処理することを忘れずに。
まとめ
curl_multi_info_read() 関数は、cURL マルチハンドリングにおいて並列リクエストの詳細な状態を把握するための強力なツールです。この関数を効果的に使用することで、複雑な並列処理をより細かく制御し、エラーハンドリングを強化することができます。
並列リクエストの裏側を覗く魔法の鏡を使いこなし、より洗練された PHP アプリケーションを構築しましょう!