現在の位置: ホーム> 最新記事一覧> curl_closeのベストプラクティス:複数の通話や不必要なメモリフットプリントを避ける方法は?

curl_closeのベストプラクティス:複数の通話や不必要なメモリフットプリントを避ける方法は?

gitbox 2025-05-15

PHPでは、Curlはcurl_init関数を介してリソースを作成して、進行中のHTTP要求を表します。 URL、リクエストメソッド、リクエストヘッダーなどのリクエストパラメーターを設定し、 curl_execを使用してリクエストを送信して応答を取得できます。各カールセッションには、リソースハンドルが割り当てられます。このハンドルは、リクエストが完了した後に明示的に閉じる必要があります。そうしないと、システムリソースを占有し、メモリの漏れにつながる可能性があります。

 $ch = curl_init('https://gitbox.net/some-api');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

2。なぜcurl_closeを使用する必要があるのですか?

curl_close関数は、Curlセッションを閉じ、そのセッションに関連するすべてのリソースを解放するために使用されます。 Curl_execがリクエストを完了した後、リソースをすぐに閉じる必要があります。 Curl_Closeが呼び出されない場合、PHPはCurlセッションリソース、廃棄物メモリを保持し、システムのパフォーマンスの低下につながる可能性があります。

 // 間違った方法:閉じていない cURL リソース
$ch = curl_init('https://gitbox.net/some-api');
$response = curl_exec($ch);
// 電話なし curl_close,リソース未释放

3. curl_closeを使用して、繰り返しの呼び出しやメモリの無駄を避けます

通常、リクエストを送信した後、Curlセッションリソースは不要になるため、できるだけ早く閉じる必要があります。頻繁にCurlセッションを作成および破壊することは一般的なプログラミングパターンですが、不必要なメモリフットプリントを避けるために、各リクエストが完了した後にCurl_Closeを呼び出す必要があります。

例:

 // それを行う正しい方法:時間内に閉じます cURL リソース
$ch = curl_init('https://gitbox.net/some-api');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);  // 閉鎖リソース,無料のメモリ

4.繰り返しの呼び出しを防ぎます

いくつかの複雑なシナリオでは、プログラムは複数のCurl要求を発行する場合があり、慎重に処理しない場合は、誤って同じリソースを繰り返し作成して閉じることができます。これにより、リソースの無駄とパフォーマンスの問題につながる可能性があります。コールの重複を回避するには、Curlセッションリソースを管理するために、Singleton Patternまたはいくつかのキャッシュメカニズムの使用を検討してください。

例:

 class CurlManager {
    private $ch;
    
    public function __construct() {
        $this->ch = curl_init('https://gitbox.net/some-api');
    }

    public function getResponse() {
        curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
        return curl_exec($this->ch);
    }

    public function close() {
        curl_close($this->ch);  // リソース管理
    }
}

// 使用 CurlManager リクエストを行います
$manager = new CurlManager();
$response = $manager->getResponse();
$manager->close();  // 閉鎖 cURL リソース

管理クラスを使用して、繰り返される通話を回避し、リソースの作成と閉鎖を効果的に制御します。

5。マルチリクエストシナリオのバッチシャットダウン

複数のカールリクエストを同時に送信する必要がある場合があります。この場合、各リクエストが正しく閉じられていることを確認することが非常に重要です。一般的な慣行は、すべてのリクエストが完了した後、複数のリクエストのカールハンドルを配列に保存し、バッチで閉じることです。

例:

 $urls = [
    'https://gitbox.net/api/endpoint1',
    'https://gitbox.net/api/endpoint2',
    'https://gitbox.net/api/endpoint3',
];

$multiCurl = [];
$mh = curl_multi_init();

foreach ($urls as $i => $url) {
    $multiCurl[$i] = curl_init($url);
    curl_setopt($multiCurl[$i], CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($mh, $multiCurl[$i]);
}

do {
    $status = curl_multi_exec($mh, $active);
    if ($active) {
        curl_multi_select($mh);
    }
} while ($active && $status == CURLM_OK);

foreach ($multiCurl as $ch) {
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);  // 批量閉鎖每个リソース
}

curl_multi_close($mh);

この例では、リソースの漏れを回避するためにすべてのリクエストが完了した後、 Curl_multi_*シリーズ関数を介して複数の要求を同時に送信し、各Curlリソースを閉じます。

6。概要

Curl_Closeを合理的に使用してCurlリソースを閉じることは、効率的で安定したPHPプログラムを作成するための鍵です。単一のリクエストであろうとバッチリクエストであろうと、リクエストが完了した後、メモリが解放され、システムリソースの廃棄物が再現された後、必ずリソースが時間内に閉じられていることを確認してください。これらのベストプラクティスに従うことにより、PHPプログラムのパフォーマンスを効果的に改善し、メモリ使用量を削減し、アプリケーションの効率と安定性を維持できます。