現在の位置: ホーム> 最新記事一覧> curl_multi_closeを使用して、複数の同時リクエストリソースをクリーニングする方法

curl_multi_closeを使用して、複数の同時リクエストリソースをクリーニングする方法

gitbox 2025-05-12

多数の同時HTTP要求を処理する場合、 CURL_MULTIシリーズ関数はPHPの非常に実用的なツールです。その中で、 curl_multi_closeは最終段階で不可欠なステップであり、 curl_multi_initによって作成されたリソースを正しくリリースするために使用されます。この記事では、 curl_multi_closeの正しい使用について説明し、一般的なリソースの漏れの問題を回避するのに役立つ実用的な例を提供します。

curl_multi_closeを使用する必要がある理由

curl_multi_initを使用してCurlマルチハンドルが作成されるたびに、PHPはマルチハンドルとそれに含まれるさまざまなリクエストを管理するためにメモリを割り当てます。 Curl_Closeで単一のクローンハンドル( curl_initによって生成)が閉じられている場合でも、マルチハンドル全体がシステムリソースを占有します。
curl_multi_closeを使用するのを忘れた場合、メモリの漏れを引き起こすのは簡単であり、高い並行性シナリオでプログラムのクラッシュさえも引き起こします。

したがって、すべての同時リクエストが完了した後、リソースを完全に解放するためにcurl_multi_closeを呼び出す必要があります

基本的な使用プロセス

curl_multiシリーズ関数を使用する一般的なプロセスは次のとおりです。

  1. マルチハンドルを作成する( curl_multi_init

  2. 複数の個別のcurlハンドル( curl_init )を作成して構成する

  3. 各カールハンドルをマルチハンドルに追加します( curl_multi_add_handle

  4. すべてのリクエストを実行および監視する( curl_multi_execおよびcurl_multi_select

  5. 単一のハンドル( curl_multi_remove_handle )を削除して閉じる( curl_close

  6. 最後にマルチハンドルを閉じます( curl_multi_close

例:複数のインターフェイスを同時に要求し、リソースを正しくクリーンアップする

複数のURLを同時に要求し、関連するすべてのリソースを正しくクリーンアップする方法を示す完全な例を以下に示します。

 <?php

// 同時リクエストを送信しますURLリスト
$urls = [
    "https://gitbox.net/api/endpoint1",
    "https://gitbox.net/api/endpoint2",
    "https://gitbox.net/api/endpoint3",
];

// 初期化 multi handle
$multiHandle = curl_multi_init();
$curlHandles = [];

// 初期化每个单独的 curl handle そして参加します multi handle
foreach ($urls as $key => $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    curl_multi_add_handle($multiHandle, $ch);
    $curlHandles[$key] = $ch;
}

// リクエストを実行します
$running = null;
do {
    $status = curl_multi_exec($multiHandle, $running);
    if ($status > CURLM_OK) {
        // エラー処理
        echo "cURL error: " . curl_multi_strerror($status);
        break;
    }

    // アクティブな接続を待っています
    curl_multi_select($multiHandle);
} while ($running > 0);

// 応答結果を収集します
$responses = [];
foreach ($curlHandles as $key => $ch) {
    $responses[$key] = curl_multi_getcontent($ch);
    // 各子供を取り外して閉じます handle
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

// 最後の終わり multi handle
curl_multi_close($multiHandle);

// 出力応答
foreach ($responses as $index => $response) {
    echo "Response from URL {$urls[$index]}:" . PHP_EOL;
    echo $response . PHP_EOL . PHP_EOL;
}
?>

注意すべきこと

  • 最初に個々のカールハンドルを削除してから、それらを閉じて、最後にマルチハンドルを閉じてください。

  • マルチハンドルを直接閉じてから、予測不可能なエラーを引き起こすため、子ハンドルを操作しないでください

  • 高い並行性環境では、長期的な閉塞を防ぐためにタイムアウト制御( curlopt_timeoutを追加することをお勧めします

要約します

curl_multi_closeは、リソースの合理的なリリースを確保するための最後のステップです。特に多国籍シナリオでは、良い閉鎖習慣を開発することが非常に重要です。各句のハンドルを正しくクリーニングし、最終的にマルチハンドルを閉じることで、リソースの漏れを効果的に防ぎ、PHPアプリケーションの安定性とパフォーマンスを向上させることができます。