現在の位置: ホーム> 最新記事一覧> 同時リクエストが完了した後、すべてのカールセッションをエレガントに閉じる方法

同時リクエストが完了した後、すべてのカールセッションをエレガントに閉じる方法

gitbox 2025-05-12

多数の同時HTTPリクエストを作成する場合、PHPが提供するCURL_MULTI_*一連の関数は、スクリプトで複数のリクエストを同時に開始できる非常に実用的なツールであり、それにより実行効率を向上させます。その中で、 curl_multi_close()は、プロセス全体の最後のステップです。 curl_multi_init()によって初期化されたリソースのクリーンアップを担当し、すべてのCurlハンドルが適切に閉じられていることを確認し、リソースの漏れの隠された危険を残しません。この記事では、完全な例を使用して、すべての並行リクエストが完了した後、すべてのカールセッションを優雅に閉じる方法を詳細に説明します。

1。基本概念のレビュー

同時リクエストにcurl_multi_*を使用する場合、一般的なプロセスは次のとおりです。

  1. curl_multiコンテナを初期化します。

  2. 複数のCurlリクエストを作成し、 Curl_Multiコンテナに追加します。

  3. curl_multi_execを使用して、すべてのリクエストの実行を促進します。

  4. ループは、リクエストが完了したかどうかを確認します。

  5. カール要求の結果を個別に処理します。

  6. 個々のカールハンドルを削除します。

  7. curl_multi_close()を使用してリソースをリリースします。

2。サンプルコードの説明

以下は、複数のURLを同時にリクエストし、すべてのリクエストが終了した後にリソースを優雅に閉じる方法を示す例を示します。

 <?php

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

// 初期化 curl_multi ハンドル
$multiHandle = curl_multi_init();
$curlHandles = [];

// それぞれのため URL 別のものを作成します curl ハンドル,そして参加します multi ハンドル
foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 10
    ]);
    curl_multi_add_handle($multiHandle, $ch);
    $curlHandles[] = $ch;
}

// すべてのリクエストを実行します
$active = null;
do {
    $mrc = curl_multi_exec($multiHandle, $active);
    // curl_multi_select アクティブな接続が発生するまでブロックします
    if ($active) {
        curl_multi_select($multiHandle);
    }
} while ($active && $mrc == CURLM_OK);

// 各リクエストの結果を取得します
foreach ($curlHandles as $ch) {
    $response = curl_multi_getcontent($ch);
    $info = curl_getinfo($ch);
    $error = curl_error($ch);

    echo "URL: " . $info['url'] . PHP_EOL;
    echo "HTTP Code: " . $info['http_code'] . PHP_EOL;
    echo "Response: " . $response . PHP_EOL;
    echo "Error: " . $error . PHP_EOL;
    echo str_repeat("-", 40) . PHP_EOL;

    // 移除并閉鎖ハンドル
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

// やっと,閉鎖 multi ハンドル
curl_multi_close($multiHandle);

?>

3。curl_multi_closeについて注意すべきこと

  • すべてのハンドルが削除された後にのみ呼び出しますcurl_multi_close()を呼び出す前に、まずcurl_multi_remove_handle()を介してマルチコンテナからすべてのクローンハンドルを削除し、次にcurl_close()を1つずつ呼び出します。そうしないと、リソースがリリースされたり、行動的に不確実でない場合があります。

  • クローンハンドルは自動的に閉じられませんcurl_multi_close()は、マルチコンテナ自体を閉じるだけで、内部カールハンドルを自動的に閉じません。 curl_init()によって作成された各ハンドルを手動で閉じる必要があります。

  • 呼び出し時間curl_multi_close()は、プロセス全体で実行する最後のステップである必要があります。その呼び出しは、同時リクエストライフサイクル全体の公式端をマークします。

4。概要

curl_multi_init()およびcurl_multi_close()を適切に使用することにより、PHPで同時のネットワークリクエストを効率的に行うことができ、使用後にリソースが適切にリリースされ、メモリリークまたは接続の例外を回避できます。必ず覚えておいてください:各curl_init()curl_close()に対応し、各curl_multi_init()curl_multi_close()に対応しているため、コードはより堅牢で信頼性が高くなります。