現在の位置: ホーム> 最新記事一覧> curl_multi_closeマルチスレッドリクエストを使用したベストプラクティス

curl_multi_closeマルチスレッドリクエストを使用したベストプラクティス

gitbox 2025-05-12

PHPでは、 Curlライブラリを使用してマルチスレッドリクエストの作成がしばしば実装されます。 Curlは、HTTPリクエストを行うのに役立つ強力なライブラリです。 curl_multi_*シリーズ関数を使用すると、PHPは複数のHTTPリクエストを並行して送信し、アプリケーションのパフォーマンスを向上させることができます。ただし、多くの人々は、リクエストが終わった後、リソースのクリーンアップを無視しています。マルチスレッドリクエストのパフォーマンスを最適化するために、 curl_multi_close関数の正しい使用が特に重要です。

curl_multi_closeとは何ですか?

curl_multi_close関数は、 curl_multi_initによって初期化されたcurlマルチハンドルを閉じるために使用されます。この関数を呼び出すと、カールリソースが解放され、メモリリークを避け、各並列リクエストが完了した後に接続が適切に閉じられていることを確認します。

マルチスレッドリクエストを作成する場合、各リクエストが完了するまでに時間がかかる場合があります。パフォーマンスを最大化し、メモリ消費を減らすために、 curl_multi_closeは非常に重要な機能です。

curl_multi_closeを使用してマルチスレッドリクエストパフォーマンスを最適化する方法は?

curl_multi_closeを使用して、マルチスレッドリクエストのパフォーマンスを最適化する基本的な例を次に示します。

 <?php

// 複数のリクエストを作成します URL 配列
$urls = [
    "http://gitbox.net/api/data1",
    "http://gitbox.net/api/data2",
    "http://gitbox.net/api/data3"
];

// 複数を初期化します cURL ハンドル
$multiHandle = curl_multi_init();
$curlHandles = [];

// ループは各リクエストを初期化します
foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  // 戻りコンテンツを文字列に設定します
    curl_multi_add_handle($multiHandle, $ch);       // 添加到多线程ハンドル中
    $curlHandles[] = $ch;  // それぞれを保存します cURL ハンドル
}

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

// すべてのリクエストの結果を取得し、リソースをクリーンアップします
foreach ($curlHandles as $ch) {
    $response = curl_multi_getcontent($ch);
    echo $response . "\n";  // 出力要求結果

    // 取り除く cURL ハンドル
    curl_multi_remove_handle($multiHandle, $ch);

    // 閉鎖 cURL ハンドル
    curl_close($ch);
}

// 閉鎖多重 cURL ハンドル
curl_multi_close($multiHandle);
?>

コードを説明してください

  1. 複数のリクエストの初期化:最初に複数のURLを含む配列を定義します。次に、 curl_initを使用して、各URLのCurlハンドルを初期化します。

  2. 複数のCurlハンドルにハンドルを追加しますcurl_multi_add_handle関数を介して、各カールハンドルを複数のハンドルに追加して、複数のリクエストを並行して実行できるようにします。

  3. すべてのリクエストを実行するcurl_multi_execを使用して、すべての並列リクエストを実行します。リクエストプロセス中に、 curl_multi_selectを使用して、リクエストが完了するのを待って、忙しくないことを確認します。

  4. リソースのクリーンアップ:すべてのリクエストが完了した後、 curl_multi_getContentを介して各要求の応答データを取得します。次に、 curl_multi_remove_handleを使用して複数のハンドルから各curlハンドルを削除し、 curl_closeを呼び出して各ハンドルを閉じます。

  5. 複数のハンドルを閉じます:最後に、 curl_multi_closeを使用して複数のCurlハンドルを閉じます。このステップは、メモリリークを避けるためにすべてのリソースを解放することです。

ベストプラクティス:並列リクエストを最適化します

  1. 並列リクエストの数を制限します。PHPはマルチスレッドリクエストを行うことができますが、同時リクエストが多すぎるとサーバーの負荷が過剰になる可能性があります。並行性の数を合理的に制限すると、パフォーマンスを改善し、不必要なネットワーク負担を回避できます。

  2. エラー処理:実際のアプリケーションでは、各リクエストの返品ステータスを確認し、リクエストの失敗を処理することを忘れないでください。 CURL_GETINFOを介して詳細なエラー情報を取得して、プログラムの安定性を確保できます。

  3. リソースリリースCurl_multi_closecurl_closeを呼び出すことは非常に重要なステップであり、すべてのリソースがリリースされるようにします。このステップを忘れた場合、特に多くの同時リクエストを行う場合、メモリリークにつながる可能性があります。

  4. バッチリクエストの分割:リクエストが非常に多い場合は、リクエストを複数のバッチに分割することを検討してください。各バッチ処理のリクエストは少なくなります。これにより、特定のバッチのリクエストが大きすぎることによって引き起こされるパフォーマンスボトルネックを回避できます。

要約します

curl_multi_closeを使用してマルチスレッドリクエストのリソースリリースを最適化することにより、アプリケーションのパフォーマンスと安定性を効果的に改善できます。同時リクエストとリソースクリーニングを正しく管理することで、メモリリークを減らすだけでなく、プログラムの応答速度を向上させることもできます。