現在の位置: ホーム> 最新記事一覧> curl_multi_closeを介して複数の要求の実行効率を改善する方法

curl_multi_closeを介して複数の要求の実行効率を改善する方法

gitbox 2025-05-12

PHPでは、HTTPリクエストにCurlを使用することは非常に一般的です。特に、複数の外部サービスにリクエストを送信する必要がある場合、 Curlはこの機能を実装するための非常に強力な方法を提供します。ただし、デフォルトでは、 Curlは同期リクエストのみをサポートします。つまり、リクエストが送信されるたびに、PHPは次のリクエストの処理を続ける前にリクエストが完了するのを待ちます。

ただし、複数のサービスにリクエストを同時に送信する必要がある場合、この同期されたアプローチは、特にリクエストの数が多い場合、重要なパフォーマンスボトルネックにつながる可能性があります。リクエストの同時実行効率を改善するために、最も重要な関数の1つはcurl_multi_closeです

curl_multi_closeとは何ですか?

curl_multi_closeは、PHPのCurl Multi-Requestライブラリの一部であり、Curlハンドルを閉じてリソースをフリーします。通常、 CURL_MULTI_EXECを使用して複数の同時リクエストが実行された後に使用されます。このようにして、複数の同時リクエストのライフサイクルをより効率的に管理することができ、それにより、特に複数のネットワークリクエストを処理する場合、パフォーマンスが向上します。

curl_multi_closeを介してリクエスト効率を改善する例

要求する必要がある複数のURLがあると仮定すると、これらの要求をcurl_multi_*関数を介して同時に実行できます。以下は、 curl_multi_closeを使用してリクエストの並行性の効率を改善するPHPサンプルコードです。

 <?php
// 複数のリクエストを初期化します cURL ハンドル
$urls = [
    "http://gitbox.net/api/endpoint1",
    "http://gitbox.net/api/endpoint2",
    "http://gitbox.net/api/endpoint3",
    "http://gitbox.net/api/endpoint4"
];

$multiHandle = curl_multi_init();
$curlHandles = [];

// それぞれのため URL 別のものを作成します cURL ハンドル
foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_multi_add_handle($multiHandle, $ch);
    $curlHandles[] = $ch;
}

// すべてのリクエストを実行します
$running = null;
do {
    curl_multi_exec($multiHandle, $running);
    curl_multi_select($multiHandle);  // リクエストが完了するのを待ちます
} while ($running);

// 応答コンテンツを取得します
foreach ($curlHandles as $ch) {
    $response = curl_multi_getcontent($ch);
    echo $response . "\n";  // 出力応答コンテンツ
}

// 閉鎖 cURL ハンドル
foreach ($curlHandles as $ch) {
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

// 無料のリソース
curl_multi_close($multiHandle);
?>

コード解析

  1. カールハンドルの初期化:最初に各URLの個別のカールハンドルを作成して、これらのハンドルを複数のカールセッションに追加します。

  2. 同時リクエストを実行する:すべての要求は、 curl_multi_execを介して非同期に実行されます。すべてのリクエストが完了するまで継続的に実行されます。 curl_multi_selectは、プログラムにリクエストが完了するのを待つため、プロセス全体をブロックしません。

  3. 応答データの取得:すべてのリクエストが完了したら、 curl_multi_getContentを介して各要求の応答コンテンツを取得します。

  4. 閉じてきれい:最後に、個々のCurlハンドルを取り外して閉じてから、 curl_multi_closeを使用して、複数のCurlセッションハンドルのリソースをリリースします。

なぜcurl_multi_closeが重要なのですか?

curl_multi_closeは、ハンドルを複数のセッションに閉じるだけでなく、すべてのCurlリソースが正しくリリースされることも保証します。長期にわたるスクリプトでは、 curl_multi_closeの合理的な使用は、メモリの漏れを効果的に防ぎ、プログラムの安定性を改善することができます。

curl_multi_*関数を使用することの利点

  1. 同時実行:従来の同期要求は順次実行されますが、 CURL_MULTI_*関数は複数のリクエストを並行して実行でき、特にリクエストを複数の異なるURLに送信する必要がある場合に実行効率を大幅に改善します。

  2. ノンブロッキングI/Ocurl_multi_selectcurl_multi_execの協力を通じて、PHPは応答のリクエストを待っている間、他の要求を処理し続け、ブロックと待機の問題を回避できます。

  3. リソースのリリースCurl_multi_closeを合理的に使用することにより、リクエストが完了した後、メモリリークやその他の問題を避けてリソースをリリースできます。

結論は

curl_multi_closeは、複数のHTTP要求の同時実行において重要な役割を果たします。 CURL_MULTI_EXECおよびCURL_MULTI_CLOSEを合理的に使用することにより、PHP開発者は複数の要求を処理するときにアプリケーションの効率を大幅に改善し、リソースが効果的に管理されることを確認できます。同時リクエストが必要なシナリオの場合、 CURLの複数の処理機能の使用は非常に効果的な最適化方法です。