PHPでcurl_multi_*関数を使用する場合、プログラムの並行性を改善するために複数のHTTP要求を同時に開始できます。 curl_multi_close関数は、すべての同時リクエストを閉じるために使用されますが、すべてのリクエストを正しく閉じ、省略を回避することを確認する方法は依然として懸念事項です。
リクエストを適切に閉じる方法を議論する前に、まずcurl_multi_*関数がどのように機能するかを理解する必要があります。 curl_multi_*シリーズ関数は主に次のとおりです。
curl_multi_init() :curlマルチハンドルを初期化します。
curl_multi_add_handle() :複数のハンドルにカールハンドルを追加します。
curl_multi_exec() :複数のハンドルに追加されたすべてのリクエストを実行します。
curl_multi_getContent() :指定されたハンドルの返品コンテンツを取得します。
curl_multi_close() : curl_multi_add_handle()を介して追加されたすべてのハンドルを閉じます。
これらの関数は、複数の同時リクエストを効率的に処理するために、互いに組み合わせて使用されることがよくあります。
多電流要求の処理では、最も一般的な問題の1つは、 curl_multi_closeが呼び出されると、すべての要求ハンドルが正しく閉じられないことです。そうすることで、リソースの漏れにつながり、プログラムの安定性に影響します。
通常、問題は次の状況で発生します。
curl_multi_execがすべてのリクエストを完了するかどうかを確認するのを忘れました。
curl_multi_closeの前に、各ハンドルは正しく削除されませんでした。
不適切なリソース管理は、一貫性のないシャットダウンハンドルをもたらします。
curl_multi_closeを使用するときにすべてのリクエストが正しく閉じられるようにするには、次の手順に従う必要があります。
まず、複数のハンドルを初期化し、各リクエストの個別のカールハンドルを初期化します。
$mh = curl_multi_init(); // 複数のハンドルを初期化します
$ch1 = curl_init("https://gitbox.net/api/endpoint1"); // 最初のリクエスト
$ch2 = curl_init("https://gitbox.net/api/endpoint2"); // 2番目のリクエスト
// リクエストハンドルを複数のハンドルに追加します
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
次に、すべてのリクエストが完了するまで、 curl_multi_execを使用してすべてのリクエストを実行します。
do {
$mrc = curl_multi_exec($mh, $active); // リクエストを実行します
if ($active) {
curl_multi_select($mh); // リクエストが完了するのを待ちます
}
} while ($active && $mrc == CURLM_OK);
すべてのリクエストが完了したら、 curl_multi_getContentを使用して各リクエストの応答コンテンツを取得し、複数のハンドルから各ハンドルを削除し、最後にすべてのハンドルを閉じることができます。
// 要求されたコンテンツを取得します
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);
// 各ハンドルを閉じて取り外します
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
// すべてのリクエストを閉じます
curl_close($ch1);
curl_close($ch2);
// 最後に、複数のハンドルを閉じます
curl_multi_close($mh);
curl_multi_closeを呼び出す前に、すべてのハンドルが正しく削除され、各ハンドルが閉じられていることを確認してください。これにより、リソースの漏れと不必要なメモリの使用が回避されます。
実際の開発では、いくつかの要求の障害に遭遇する可能性があります。例外的な状況ですべてのハンドルを正しく閉じることができるようにするには、実行中に例外キャッチとエラー処理メカニズムを追加することをお勧めします。
// 例外処理を追加します
try {
// 同時リクエストを実行するコード(上記のように)
if ($mrc != CURLM_OK) {
throw new Exception("Error in curl_multi_exec: $mrc");
}
} catch (Exception $e) {
// 例外と閉鎖リソースをキャッチします
echo "Error: " . $e->getMessage();
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_close($ch1);
curl_close($ch2);
curl_multi_close($mh);
}
このようにして、エラーが発生したとしても、プログラムはリソースを正しくクリーンアップできることが保証されます。
curl_multi_*一連の関数を合理的に使用し、次のポイントに従うことにより、 curl_multi_closeがすべての同時リクエストを正しく閉じることができるようにすることができます。
curl_multi_closeを呼び出す前に、必ず各ハンドルを取り外してください。
curl_multi_execを使用するときは、すべてのリクエストが完了するのを待ちます。
除外されていないハンドルを避けるために、例外を適切に処理します。
これらのベストプラクティスを通じて、同時リクエストをより適切に管理し、リソースのリークを回避し、コードの堅牢性とパフォーマンスを向上させることができます。