現在の位置: ホーム> 最新記事一覧> リクエストを繰り返したときにcurl_closeに複数の呼び出しによって引き起こされる問題を回避する方法は?

リクエストを繰り返したときにcurl_closeに複数の呼び出しによって引き起こされる問題を回避する方法は?

gitbox 2025-05-18

Curlを使用する場合、まずCurlセッションを作成し、 curl_init()を使用してCurlハンドルを初期化する必要があります。このハンドルは、リクエストプロセス中に接続関連情報を保持します。リクエストが完了したら、通常、 curl_close()を使用してハンドルを閉じ、システムリソースを解放します。

 $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/api/data"); // リクエストを設定します URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 戻り結果を文字列に設定します

$response = curl_exec($ch); // リクエストを実行して、応答を取得します

curl_close($ch); // セッションを閉じます

上記のコードでは、リクエストが開始されるたびに新しいCurlセッションが作成され、セッションを閉じるためにリクエストが完了した後にCurl_Close()が呼び出されます。これは、各Curlセッションが一定量のリソースを占有し、 Curl_Close()を使用してこれらのリソースを解放できるため、これが必要です。

2。複数の要求でcurl_close()への繰り返しの呼び出しを避けてください

実際の開発では、複数のリクエストを実行する必要があるシナリオがある場合があります。各リクエストが完了した直後にcurl_close()が呼び出された場合、システムリソースを無駄にする毎回接続が繰り返し閉じられます。これを回避するために、それは通常、マルチプレックスカールセッションを行い、セッションを均一に閉じる前にすべてのリクエストが完了するまで複数のリクエスト間でセッションハンドルを共有する方法です。

 $ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 戻り結果を文字列に設定します

// 聞く 1
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/api/endpoint1");
$response1 = curl_exec($ch);

// 聞く 2
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/api/endpoint2");
$response2 = curl_exec($ch);

// 聞く 3
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/api/endpoint3");
$response3 = curl_exec($ch);

curl_close($ch); // 一次性セッションを閉じます

この例では、すべてのリクエストがcurlセッションのハンドル$ chcurl_close()を共有し、すべての要求が完了した後にのみ呼び出されます。これにより、セッションの繰り返しの作成と破壊が回避され、それにより不必要なリソースのオーバーヘッドが減少します。

3. curl_multi_*関数を使用して、複数のリクエストを処理します

複数のリクエストを同時に開始する必要がある場合、 curl_multi_*関数を使用して複数のCurlセッションを並行して処理することがより効率的な方法です。このようにして、 curl_close()への複数の呼び出しを回避し、複数の要求されたリソースをより適切に管理できます。

 $mh = curl_multi_init(); // 複数のハンドルを初期化します
$ch1 = curl_init();
$ch2 = curl_init();

curl_setopt($ch1, CURLOPT_URL, "https://gitbox.net/api/endpoint1");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch2, CURLOPT_URL, "https://gitbox.net/api/endpoint2");
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

curl_multi_add_handle($mh, $ch1); // 複数のハンドルにハンドルを追加します
curl_multi_add_handle($mh, $ch2);

do {
    curl_multi_exec($mh, $active); // 执行聞く
} while ($active > 0);

$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_*関数を介して複数のCurlセッションが並行して実行されます。要求された各リソースは、完了後に1回のみ閉鎖され、それによりプログラムの実行効率が改善され、要求された各リソースが適切にリリースされるようにします。

4.エラー処理とリソースのリリース

curl_close()を正しく使用すると、リソースの漏れを回避できますが、Curlリクエストを実行すると、リクエストの障害に遭遇する可能性もあります。エラーが発生した場合、各リクエストでリソースが適切に解放されるようにすることが重要です。 curl_errno()を確認して、リクエストが成功したかどうかを判断できます。失敗した場合、対応するエラー処理が実行されます。

 $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/api/invalid-endpoint");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);

if(curl_errno($ch)) {
    // 聞く失败时的处理
    echo "cURL Error: " . curl_error($ch);
} else {
    // 聞く成功时的处理
    echo "Response: " . $response;
}

curl_close($ch); // 即使聞く失败,また、リソースのリリースを確認してください

5。概要

curl_close()関数の正しい使用は、Curlセッションで占められているリソースを効果的にリリースし、繰り返し呼び出しによって引き起こされるパフォーマンスの問題を回避できます。複数のリクエスト間で同じセッションを共有するか、並列処理のためにcurl_multi_*関数を使用すると、 curl_close()への複数の呼び出しの頻度を減らすことで、プログラムの実行効率とリソース管理が改善されます。さらに、エラー処理とリソースのリリースも同様に重要であり、リクエストごとにリソースが適切に解放され、メモリリークやその他の問題が回避されます。