現在の位置: ホーム> 最新記事一覧> curl_multi_closeで長期にわたるリクエストを正しく終了する方法

curl_multi_closeで長期にわたるリクエストを正しく終了する方法

gitbox 2025-05-12

PHPでは、 curl_multi_*一連の関数は、複数のHTTP要求を同時に開始する強力な方法を提供し、それによりプログラムの並行性パフォーマンスを改善します。その中で、 curl_multi_close()は、リソースのクリーンアップに使用される関数です。これは、すべての同時リクエストが完了した後に呼び出され、基礎となるリソースをリリースする上で重要なステップです。ただし、不適切に使用すると、メモリリークを引き起こすか、リクエストが完全に終了するわけではありません。

この記事では、実際のコード例を使用して、curl_multi_close()を正しく使用して長期にわたるリクエストを終了する方法を説明します。

1。curl_multi_closeとは何ですか?

curl_multi_close()、curl_multi_init()とペアになった最終関数です。その目的は、マルチハンドルリソースを閉じて、それに関連するすべてのリソースをリリースすることです。このマルチハンドルに追加された個々のカールハンドルを自動的に閉じていないため、手動で処理する必要があることに注意してください。

2。同時リクエストの基本的な例

CURL_MULTI_*シリーズの関数を使用して複数のHTTP要求を実行し、正しくクロージングリソースを使用して、以下に次のように標準的なプロセスを示します。

 <?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 = [];

// それぞれのため URL 初期化单独的 curl handle そして追加します multi handle 真ん中
foreach ($urls as $i => $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($multiHandle, $ch);
    $curlHandles[$i] = $ch;
}

// すべてのリクエストを実行します
$running = null;
do {
    $status = curl_multi_exec($multiHandle, $running);
    if ($running) {
        curl_multi_select($multiHandle); // 避ける CPU 占有が高すぎる
    }
} while ($running && $status == CURLM_OK);

// 結果を処理し、それぞれを閉じます curl handle
foreach ($curlHandles as $ch) {
    $response = curl_multi_getcontent($ch);
    $info = curl_getinfo($ch);
    echo "ステータスコードを要求します: " . $info['http_code'] . "\n";
    echo "応答コンテンツ: " . substr($response, 0, 100) . "...\n"; // いくつかのコンテンツのみを表示します
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

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

3.一般的なエラーとソリューション

  1. エラー:ハンドルを取り外さずにマルチハンドルを閉じます

    // 間違った使用法
    curl_close($ch);  // 最初に閉じます curl handle
    curl_multi_close($mh);
    

    正しい順序は次のとおりです。

     curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
    curl_multi_close($mh);
    
  2. エラー:すべてのリクエストが完了するのを待っていません

    一部の開発者は、 curl_multi_select()を直接スキップするか、 curl_multi_exec()の直後に直接閉じます。 do-whileループを使用することは、すべてのリクエストが完了することを確認するための信頼できる方法です。

4.リクエストに長い時間がかかる場合はどうすればよいですか?

長期にわたるリクエスト(大きなファイルのダウンロードやリモート計算など)の場合、次の方法を制御できます。

  • 合理的なcurlopt_timeoutを設定します

  • CURL_MULTI_SELECT()を使用して、CPU使用量を削減します

  • curl_multi_info_read()によって返されたステータスを確認して処理します

例(タイムアウトコントロールの追加):

 curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 最大実行時間を設定します302番

5。概要

curl_multi_close()自体は複雑ではありませんが、リソースが完全にリリースされるようにするには、curl_multi_remove_handle()curl_close()で使用する必要があります。高い並行性要求シナリオでは、標準的にカールハンドルを閉じることは、リソースの漏れを回避し、プログラムの安定性を改善するための鍵です。

マルチスレッドネットワークリクエストを使用する場合は、次の順序に留意してください。

  1. マルチハンドルに単一のハンドルを追加します

  2. マルチハンドルを実行します

  3. 結果を取得します

  4. 1つのハンドルを取り外して閉じます

  5. 最後にマルチハンドルを閉じます

上記の方法により、 Curl_multi_*シリーズ関数を効率的に使用し、すべての接続を正しく終了して、コードの保守性と操作効率を向上させることができます。