現在の位置: ホーム> 最新記事一覧> curl_multi_closeを呼び出すときに複数の異なる返品値を処理する方法

curl_multi_closeを呼び出すときに複数の異なる返品値を処理する方法

gitbox 2025-05-12

curl_multi_init()およびcurl_multi_add_handle()curl_multi_exec()curl_multi_getcontent() 、およびcurl_multi_close( )などの関連関数は、PHPで複数の同時のCurl要求を処理するときに非常に実用的です。この一連のインターフェイスは、特に複数のインターフェイスを要求したり、大量のWebページデータをクロールしたり、同時のAPI呼び出しロジックを構築する場合、パフォーマンスを大幅に改善できます。

ただし、 curl_multi_close()を呼び出す前に、通常、各リクエストの返品値を収集して処理する必要があります。さまざまなリクエストは、異なる形式や状態で結果を返す可能性があります。これらのリターン値を効率的に管理する方法は、開発者が直面しなければならない問題です。

この記事では、 curl_multi_close()を呼び出す前に、複数の返品値の処理を構成する方法を詳細に説明します。

基本的なプロセスレビュー

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

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

// 複数を初期化します cURL handle
foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($multiHandle, $ch);
    $curlHandles[] = $ch;
}

// すべてのリクエストを実行します
$running = null;
do {
    curl_multi_exec($multiHandle, $running);
    curl_multi_select($multiHandle);
} while ($running > 0);

各リクエストの返品値を処理します

実行が完了した後、通常、各ハンドルを通過してコンテンツやその他の情報を取得します。

 $responses = [];

foreach ($curlHandles as $ch) {
    $content = curl_multi_getcontent($ch);
    $error = curl_error($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    
    $responses[] = [
        'content' => $content,
        'error'   => $error,
        'http_code' => $httpCode,
    ];

    // シングルを無料 handle
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

マルチハンドルを閉じます

すべてのデータを収集した後、最後のステップはマルチハンドルを閉じることです。

 curl_multi_close($multiHandle);

サンプル出力構造

上記の処理により、最終的によく構造化された$ resesアレイが得られます。

 [
    [
        'content' => '{...}', // JSONまたはHTML待って
        'error' => '',        // エラーがない場合
        'http_code' => 200,
    ],
    [
        'content' => '',
        'error' => 'Could not resolve host: gitbox.net',
        'http_code' => 0,
    ],
    ...
]

これにより、マルチハンドルを閉じる前に、各リクエストの応答値を形式で収集できます。これは、ロギング、エラー分析、再試行戦略などの後続の処理に便利です。

ベストプラクティスの推奨事項

  1. 例外処理集中化:HTTP 5XX Retry、HTTP 4XXロギング警告など、各リクエストの処理ポリシーを定義します。

  2. データ形式の事前検証json_decode()を使用して、その後のビジネスロジッククラッシュを避けるために応答コンテンツが合法かどうかを判断してください。

  3. 応答マッピングID :数百のリクエストを処理する場合は、対応する応答ソースを容易にするために、各ハンドルのカスタムID(URLやIDなど)を設定することをお勧めします。

  4. CURL_MULTI_SELECT()を合理的に使用します。CPU使用量を効果的に削減し、 CURL_MULTI_EXECの無制限のポーリングを避けることができます。

要約します

curl_multi_close()でリソースを閉じる前に、各Curlハンドルから必要なすべての情報を抽出していることを確認してください。コンテンツエラーhttp_codeの構造化されたコレクションにより、大規模な同時リクエストを効率的に管理し、その後のビジネス処理のための強固な基盤を築くことができます。

簡単に再利用するために、このコードを一般的な関数にパッケージ化する必要がありますか?