現在の位置: ホーム> 最新記事一覧> curl_execおよびcurl_multi_closeを使用するためのベストプラクティス

curl_execおよびcurl_multi_closeを使用するためのベストプラクティス

gitbox 2025-05-29

開発では、多くの場合、複数のサーバーまたはAPIにHTTPリクエストを開始する必要があります。従来のシングルスレッド方法に従って1つずつリクエストする場合、それは遅くなるだけでなく、サーバーのリソースも無駄にします。 PHPはCurl拡張機能を提供します。ここでは、 curl_multi_execおよびcurl_multi_close関数がマルチリクエストの同時処理を実装し、効率を大幅に改善できます。

この記事では、効率的な並行性処理のためにcurl_execcurl_multi_closeを組み合わせて使用​​する方法を詳細に紹介し、特定の例を示します。

基本概念

  • curl_exec() :単一のCurl要求を実行します。

  • curl_multi_exec() :複数のCurlハンドルを同時に実行します。

  • curl_multi_close() :curlバッチハンドルを閉じてリソースをリリースします。

多数のリクエストを同時に処理する必要がある場合は、各リクエストに対してCurl_execを個別に呼び出す代わりに、 curl_multi_execを使用することをお勧めします。 curl_multi_closeは、すべてのリクエストが処理された後、リソースをクリーンアップするための重要なステップです。

サンプルコード

複数のインターフェイスを同時に要求し、応答を処理する方法を示す簡単な例を次に示します。

 <?php
// 要求するURLリスト
$urls = [
    "https://gitbox.net/api/data1",
    "https://gitbox.net/api/data2",
    "https://gitbox.net/api/data3",
];

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

foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($multiHandle, $ch);
    $curlHandles[] = $ch;
}

// すべてのリクエストを実行します
$running = null;
do {
    $status = curl_multi_exec($multiHandle, $running);
    if ($status > 0) {
        // エラーが発生しました
        echo "cURL error: " . curl_multi_strerror($status);
        break;
    }
    // アクティブな接続を待っています
    curl_multi_select($multiHandle);
} while ($running > 0);

// 各リクエストの応答を処理します
foreach ($curlHandles as $ch) {
    $response = curl_multi_getcontent($ch);
    $info = curl_getinfo($ch);
    if (curl_errno($ch)) {
        echo 'Request Error: ' . curl_error($ch) . PHP_EOL;
    } else {
        echo 'HTTP Code: ' . $info['http_code'] . PHP_EOL;
        echo 'Response: ' . $response . PHP_EOL;
    }
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

// 閉鎖multi handle
curl_multi_close($multiHandle);
?>

説明します

  • 最初にcurl_multi_init()を介してマルチハンドルを作成します。

  • 各カールを個別に設定した後、 curl_multi_add_handle()を介してマルチハンドルに追加します。

  • curl_multi_exec()を使用してすべてのリクエストを実行し、すべてのリクエストが完了するまでポーリングします。

  • curl_multi_select()は、CPUのアイドル性を低下させ、効率を向上させることができます。

  • リクエストが完了したら、 curl_multi_getContent()を使用して応答コンテンツを取得します。

  • 最後に、 curl_multi_remove_handle()を使用してハンドルを削除し、 curl_multi_close()でマルチハンドルを閉じてリソースを解放してください。

注意すべきこと

  • 同時数:1回限りのリクエストにURLが多すぎる場合は、リソースを消費しないように一度に10個のリクエストのみが送信されるなど、バッチでそれらを処理することをお勧めします。

  • タイムアウト処理curlopt_timeoutまたはcurlopt_connecttimeoutを設定して、いくつかのリクエストの長期的なハングを避けることができます。

  • エラー処理curl_errno()およびcurl_error()を使用して、単一の要求がエラーなしかどうかを確認します。

  • 接続の再利用curlopt_forbid_reuseをオンにすると、頻繁なTCP接続の作成を回避し、パフォーマンスを向上させることができます。

要約します

curl_execcurl_multi_closeを組み合わせることにより、PHPで多数のHTTP並行要求を効率的に処理できます。この方法は、要求全体を短縮するだけでなく、サーバーの並行性機能を最大限に活用します。これは、高性能PHPアプリケーションを構築するための重要なスキルの1つです。

これらの基本を習得することで、PHPアプリケーションをより速く、より安定させることができます!