PHPでは、 CurlはHTTPリクエストを送信して応答を取得するのに役立つ強力なライブラリです。 curl_multi_*関数セット、特にcurl_multi_closeを使用して、複数のCurl要求を同時に処理できます。複数のCurlハンドルで操作を完了すると、 curl_multi_closeを使用してハンドルを閉じることが重要なステップです。ただし、関連するリソースを正しくリリースしないと、メモリリークやエラーにつながる可能性があります。
この記事では、 curl_multi_close関数を使用した後にリソースを正しくリリースする方法を紹介し、メモリリークとエラーを回避します。
PHPでは、 curl_multi_*関数を使用すると、複数のCurl要求を同時に処理できます。 curl_multi_initは、複数のcurlハンドルを初期化するために使用され、 curl_multi_add_handleは個々のCurlハンドルを複数のCurlハンドルに追加するために使用され、 curl_multi_execはすべてのリクエストを実行するために使用されます。すべてのリクエストが完了した後、 curl_multi_closeを使用してこれらのハンドルを閉じます。
サンプルコード:
$multiCurl = curl_multi_init();
$curlHandles = [];
for ($i = 0; $i < 3; $i++) {
$curlHandles[$i] = curl_init("https://gitbox.net/api/data?id=$i");
curl_setopt($curlHandles[$i], CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiCurl, $curlHandles[$i]);
}
$running = null;
do {
curl_multi_exec($multiCurl, $running);
} while ($running);
foreach ($curlHandles as $ch) {
$response = curl_multi_getcontent($ch);
echo $response . "\n";
}
// すべてのハンドルを閉じます
curl_multi_close($multiCurl);
Curl_multi_closeを使用した後、複数のCurlハンドルを閉じますが、個々のCurlハンドルは明示的にリリースされるまで残ります。これらのハンドルをリリースしない場合、それらはメモリを取り上げ続け、メモリリークにつながる可能性があります。
リソースが適切にリリースされるようにするには、複数のCurlハンドルを閉じて個々のCurlハンドルを解放した後、 Curl_Closeを明示的に呼び出す必要があります。
// それぞれを閉じます cURL ハンドル
foreach ($curlHandles as $ch) {
curl_close($ch);
}
これを行うと、 curl_multi_closeの後、各Curlハンドルも正しくリリースされ、メモリリークが回避されます。
複数のCurl要求の実行中にエラーが発生する場合があります。これらのエラーを処理するときは、エラーが発生したときにカールハンドルが適切に閉じられていることを確認することが重要です。エラーが発生した場合でも、最後に常にリソースをクリーンアップする必要があります。
エラー処理コードの例:
$multiCurl = curl_multi_init();
$curlHandles = [];
for ($i = 0; $i < 3; $i++) {
$curlHandles[$i] = curl_init("https://gitbox.net/api/data?id=$i");
curl_setopt($curlHandles[$i], CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiCurl, $curlHandles[$i]);
}
$running = null;
do {
$execReturn = curl_multi_exec($multiCurl, $running);
if ($execReturn !== CURLM_OK) {
echo "Error occurred while executing multi requests.\n";
break;
}
} while ($running);
foreach ($curlHandles as $ch) {
if (curl_errno($ch)) {
echo "cURL error: " . curl_error($ch) . "\n";
} else {
$response = curl_multi_getcontent($ch);
echo $response . "\n";
}
curl_close($ch);
}
curl_multi_close($multiCurl);
このコードにより、エラーが発生したとしても、すべてのカールハンドルがリリースされ、リソースの漏れが回避されることが保証されます。
curl_multi_closeを使用した後、 Curl_closeを使用して、各Curlハンドルを個別に閉じることを忘れないでください。
エラーが発生したら、すべてのリソースがまだ解放されていることを確認し、メモリリークを避けてください。
curl_multi_closeは複数のCurlハンドルのみを閉じることができますが、個別のCurlハンドルを自動的に閉じることはできません。それらは手動で掃除する必要があります。
これらのベストプラクティスに従うことで、メモリリークやエラーを回避し、プログラムをより効率的で安定させることができます。