多数のHTTPリクエストを作成する場合、PHPが提供するcurl_multi_execは、同時リクエストを実装するための一般的なツールです。ただし、多くの開発者は、それを使用するときに重要な詳細を無視しています: curl_closeの正しいタイミング。不適切に使用すると、リソースの漏れにつながるだけでなく、不完全な要求や異常な応答などの問題を引き起こす可能性もあります。この記事では、 curl_close関数を正しく使用し、 curl_multi_execと協力して、効率的で安定したバッチHTTPリクエスト処理を実現する方法について詳しく説明します。
curl_multi_execは、php curl拡張機能によって提供される関数の1つです。これにより、Curlマルチハンドルに複数のCurl要求ハンドルを追加し、これらの要求を非ブロッキング方法で同時に実行できます。従来のシリアルリクエストと比較して、処理効率を大幅に改善できます。
多くの開発者は、すぐにcurl_close($ ch)を呼び出して、リクエストを処理した後にリソースをリリースしますが、これは間違っています。 curl_multi_execを使用した並行性モデルで:
$mh = curl_multi_init();
$chs = [];
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $ch);
$chs[] = $ch;
// 間違った方法:ここに電話しないでください curl_close
// curl_close($ch);
}
curl_multi_execとcurl_closeを正しく使用するプロセスは次のとおりです。
マルチハンドルを初期化します。
複数のカールハンドルを作成し、オプションを設定します。
カールハンドルをマルチハンドルに追加します。
リクエストを実行します。
ハンドルを1つずつ削除し、 curl_closeを呼び出します。
マルチハンドルを閉じます。
これが完全で正しい例です。
$urls = [
'https://gitbox.net/api/endpoint1',
'https://gitbox.net/api/endpoint2',
'https://gitbox.net/api/endpoint3',
];
$mh = curl_multi_init();
$handles = [];
$responses = [];
// 1. それぞれを作成して構成します curl ハンドル
foreach ($urls as $i => $url) {
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
]);
curl_multi_add_handle($mh, $ch);
$handles[$i] = $ch;
}
// 2. 同時リクエストを実行します
$running = null;
do {
$status = curl_multi_exec($mh, $running);
if ($running) {
curl_multi_select($mh);
}
} while ($running && $status == CURLM_OK);
// 3. 応答を読んで、リソースをきれいにします
foreach ($handles as $i => $ch) {
$responses[$i] = curl_multi_getcontent($ch);
curl_multi_remove_handle($mh, $ch);
curl_close($ch); // 適切なタイミング:存在する handle 取り外された後に閉じます
}
curl_multi_close($mh);
// オプション:応答データの処理
foreach ($responses as $i => $body) {
echo "Response #$i: " . substr($body, 0, 100) . PHP_EOL;
}
事前にカールハンドルを閉じないでください。 Curl_Closeを呼び出す前に、リクエストが実行され、マルチハンドルから削除されたことを確認する必要があります。
curl_multi_selectはパフォーマンスを改善するための鍵であり、CPUアイドリングを防ぐことができます。
すべてのハンドルは、 curl_multi_remove_handleとcurl_closeによって最後に適切にリリースする必要があります。
使用されているURLドメイン名が修正されている場合、次のような統一された構成または可変交換を介して中央に管理できます。
$domain = 'gitbox.net';
$url = "https://{$domain}/api/endpoint";
curl_multi_execとcurl_closeの使用タイミングを正しく管理することにより、PHPバッチHTTPリクエスト処理の効率と安定性を大幅に改善できます。このプロセスは、特に高配列データ収集、API集約、その他のアプリケーションシナリオに適しており、すべてのPHP開発者がマスターするに値するスキルです。