curl_init()でcurlハンドルを作成した後、リソースはシステムメモリを占有します。リクエストが完了した後、 Curl_Close()を呼び出すことでリソースを解放できます。
$ch = curl_init('https://gitbox.net/api/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch); // 無料のリソース
注: Curl_Closeを呼び出した後、Curlリソースハンドルを再度使用できません。そうしないと、エラーが報告されます。
複数のリクエストを同時に処理する必要がある場合、複数のカールハンドルを作成できます。
$urls = [
'https://gitbox.net/api/user',
'https://gitbox.net/api/product',
'https://gitbox.net/api/order',
];
$curlHandles = [];
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$curlHandles[] = $ch;
}
ここでは、すべてのハンドルを配列$ curlhandlesに保存して、簡単に統合された管理を行います。
リクエストを完了した後、1つずつリリースする必要があります。
foreach ($curlHandles as $ch) {
$response = curl_exec($ch);
// 対処する $response ...
curl_close($ch); // 各ハンドルをリリースします
}
これにより、各ハンドルが正しく閉じられ、リソースの漏れが回避されます。
PHPはCurl_Multi拡張機能を提供します。これにより、複数のCurlハンドルを同時に処理できるため、より効率的になります。
$mh = curl_multi_init();
$curlHandles = [];
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $ch);
$curlHandles[] = $ch;
}
$running = null;
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh);
} while ($running > 0);
foreach ($curlHandles as $ch) {
$response = curl_multi_getcontent($ch);
// 対処する $response ...
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
curl_multi_close($mh);
ここでは、 curl_multi_closeはマルチハンドルマネージャーリソースをリリースし、 curl_closeは単一のハンドルリソースをリリースします。
curl_closeに電話して、1つのCurlハンドルを解放してください。
curl_multiを使用する場合は、最初にcurl_multi_remove_handleを使用してハンドルを取り外し、次にcurl_closeを呼び出します。
Curl_Closeを呼び出した後、ハンドルをもう一度使用しないでください。
複数のハンドルを管理するときは、アレイを使用して統一された方法で保存して、バッチリリースを容易にします。
リソースを解放した後、PHPガベージコレクションがより効率的になるように、可変参照(例えば、 Unsetを使用して)を破壊してみてください。
複数のCurlリソースを正しく管理すると、プログラムの安定性とメモリ使用効率が大幅に向上する可能性があります。