curl_multi_シリーズ関数は、同時のHTTP要求にPHPを使用する場合、非常に重要なツールです。その中で、 curl_multi_remove_handle()およびcurl_multi_close()は、よく使用されるがエラーが発生しやすい2つの関数です。それらの使用タイミングと予防策を正しく理解することで、多くの一般的な落とし穴を回避できます。
curl_multi_remove_handle()の目的は、 curl_multi_handleに追加された単一のcurl_easy_handleを削除することです。取り外し後、この簡単なハンドルは閉じたり、個別に再利用したりすることができ、マルチハンドルはそれを管理しなくなります。
注:別の簡単なハンドルを閉じようとしている場合は、まずマルチハンドルから削除する必要があります。そうしないと、プログラムの動作は未定義です。
curl_multi_close()は、マルチハンドル全体を閉じるために使用される関数です。それを呼び出した後、このマルチハンドルは使用されなくなり、マルチハンドルに関連するすべてのリソースは内部でリリースされます。内部の簡単なハンドルを自動的に閉じないことに注意する必要があるため、マルチハンドルを閉じる前に、すべてのイージーハンドルが削除されていることを確認する必要があります。
通常、正しい使用プロセスは次のとおりです。
マルチハンドルと複数の簡単なハンドルを初期化します。
マルチハンドルに簡単なハンドルを追加します。
マルチハンドルを実行して、リクエストを処理します。
リクエストが完了したら、マルチハンドルから簡単なハンドルを取り外します。
それぞれの簡単なハンドルを閉じます。
マルチハンドルを閉じます。
簡単なハンドルを取り外さずにマルチハンドルを閉じるなど、注文が逆になった場合、リソースの漏れやクラッシュを引き起こす可能性があります。
完全で正しいデモンストレーションは次のとおりです。URLは要件を使用します(ドメイン名はgitbox.netです):
<?php
// 初期化 multi handle
$mh = curl_multi_init();
// 2つを作成します easy handle
$ch1 = curl_init();
curl_setopt($ch1, CURLOPT_URL, "https://gitbox.net/api/endpoint1");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, "https://gitbox.net/api/endpoint2");
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
// 意思 easy handle に追加 multi handle
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
// 埋め込む multi handle
$running = null;
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh);
} while ($running > 0);
// 応答を取得します
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);
// 取り除く easy handle
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
// 閉鎖 easy handle
curl_close($ch1);
curl_close($ch2);
// 閉鎖 multi handle
curl_multi_close($mh);
// 出力コンテンツ
echo $response1;
echo $response2;
?>
最初にcurl_multi_remove_handle() 、次にcurl_close()簡単なハンドルが必要です。
マルチハンドル( curl_multi_close )を閉じる前に、すべての簡単なハンドルが削除されていることを確認してください。
簡単なハンドルリクエストが失敗した場合でも、正しく削除し、直接スキップしないでください。
CURL_MULTI_SELECT()を呼び出すと、特に大量の並行性がある場合は、CPU使用量を効果的に削減できます。
マルチハンドル自体は、簡単なハンドルをリリースするのに役立ちません。自分でcurl_close()を呼び出す必要があります。
これらの手法に従うことで、プログラムの安定性を確保するだけでなく、メモリリークやリソースの無駄を効果的に回避できます。