現在の位置: ホーム> 最新記事一覧> curl_multi_select()とcurl_upkeep()を組み合わせて接続を最適化する方法

curl_multi_select()とcurl_upkeep()を組み合わせて接続を最適化する方法

M66 2025-06-06

大規模なHTTPリクエストを作成するとき、PHPのCurlライブラリは、同時リクエストを行い、パフォーマンスを改善するのに役立つ非常に強力なツールです。ただし、接続を効率的に管理する必要があるため、複数のリクエストを配置するだけでは、必ずしも最適なパフォーマンスにつながるとは限りません。より効率的な接続最適化を実現するために、 curl_upkeep()およびcurl_multi_select()関数を使用して、接続のオーバーヘッドを減らすことができます。

1. curl_upkeep()curl_multi_select()とは何ですか?

  • curl_upkeep() :この関数は、主に初期化されたCurl接続を管理するために使用され、使用時に有効であることを保証し、接続の再利用を維持してリソースを節約し、複製接続の確立プロセスを減らします。

  • curl_multi_select() :この関数は、 curl_multi_exec()で使用されます。その機能は、少なくとも1つのカールハンドルが準備が整うのを待つことをブロックすることであり、多数の同時リクエストの効率的な管理に適しています。

これら2つの機能を組み合わせることにより、各要求中の遅延を大幅に削減し、複数のリクエスト間の同時処理効率を改善できます。

2。基本的なカールマルチタスク

curl_upkeep()およびcurl_multi_select()の使用方法を紹介する前に、基本的なマルチタスクの実行方法を確認しましょう。次のコードは、curl_multi_init()curl_multi_exec()を使用して同時リクエストを行う方法を示しています。

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

$urls = [
    'https://m66.net/api/data1',
    'https://m66.net/api/data2',
    'https://m66.net/api/data3'
];

// リクエストごとに1つを作成しますcURLハンドル
foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($mh, $ch);
    $handles[] = $ch;
}

// マルチタスクリクエストを実行します
do {
    $status = curl_multi_exec($mh, $active);
    if ($active) {
        curl_multi_select($mh); // アクティブなリクエストが発生するまでブロックします
    }
} while ($active);

// 結果を処理してクリーニングします
foreach ($handles as $ch) {
    $response = curl_multi_getcontent($ch);
    echo $response;
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}

curl_multi_close($mh);

このコードマルチタスクは、 curl_multi_exec()を介して要求し、 curl_multi_select()を呼び出して、ループが毎回アクティブな接続を待つため、不必要なCPUリソースの使用を回避します。

3. curl_upkeep()を使用して、接続の多重化を実装します

頻繁な確立と接続の破壊を避けるために、 curl_upkeep()関数を介して接続の多重化を実装できます。 PHPはcurl_upkeep()関数を直接提供していませんが、 curl_multi_*関数の組み合わせを使用して同様の関数を実現できます。具体的には、リクエストするたびに接続を再現する代わりに、これらの接続を管理するために永続的な接続プールを使用します。

実装手順:

  1. 接続プールの初期化:最初にカールハンドルプールを作成すると、各リクエストの新しい接続を初期化する代わりに、プール内の接続が再利用されます。

  2. 接続の多重化:マルチタスク要求の実行中に、接続プールの接続を確認できます。自由接続がある場合は、再利用できます。

サンプルコード:

 // 永続的な接続プールを作成します
$mh = curl_multi_init();
$handles = [];
$connectionPool = [];

// リクエストURLs
$urls = [
    'https://m66.net/api/data1',
    'https://m66.net/api/data2',
    'https://m66.net/api/data3'
];

// 初期化cURLハンドル并存储
foreach ($urls as $url) {
    if (empty($connectionPool[$url])) {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $connectionPool[$url] = $ch; // 接続プールに新しい接続を保存します
    } else {
        $ch = $connectionPool[$url]; // 接続プールで既存の接続を使用します
    }

    curl_multi_add_handle($mh, $ch);
    $handles[] = $ch;
}

// マルチタスクリクエストを実行します
do {
    $status = curl_multi_exec($mh, $active);
    if ($active) {
        curl_multi_select($mh); // アクティブなリクエストが発生するまでブロックします
    }
} while ($active);

// 結果を処理してクリーニングします
foreach ($handles as $ch) {
    $response = curl_multi_getcontent($ch);
    echo $response;
    curl_multi_remove_handle($mh, $ch);
    // ここでは、接続を閉じません,接続プールで多重化を維持します
}

curl_multi_close($mh);

上記のコードでは、マルチタスクリクエストが実行されると、プールの接続で単純な接続プールConnectionPoolを作成し、多重化します。これにより、特に複数のリクエストが同じドメイン名を指している場合、接続効率を大幅に改善できます。

4。概要

curl_upkeep() (接続プール管理)とcurl_multi_select() (アクティブリクエストをブロックして待機)を組み合わせることにより、PHPのCurlマルチタスク要求を最適化して、システム全体のパフォーマンスを改善できます。接続プーリングメカニズムは、接続の頻繁な作成と破壊を効果的に削減し、システムリソースを節約しますが、 curl_multi_select()は効率的な同時実行を保証します。

このようにして、大量のHTTP要求を処理するときに接続をより効率的に管理し、プログラムの応答速度を改善し、遅延を削減し、より高いパフォーマンスを達成できます。