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,
],
...
]
これにより、マルチハンドルを閉じる前に、各リクエストの応答値を形式で収集できます。これは、ロギング、エラー分析、再試行戦略などの後続の処理に便利です。
例外処理集中化:HTTP 5XX Retry、HTTP 4XXロギング警告など、各リクエストの処理ポリシーを定義します。
データ形式の事前検証: json_decode()を使用して、その後のビジネスロジッククラッシュを避けるために応答コンテンツが合法かどうかを判断してください。
応答マッピングID :数百のリクエストを処理する場合は、対応する応答ソースを容易にするために、各ハンドルのカスタムID(URLやIDなど)を設定することをお勧めします。
CURL_MULTI_SELECT()を合理的に使用します。CPU使用量を効果的に削減し、 CURL_MULTI_EXECの無制限のポーリングを避けることができます。
curl_multi_close()でリソースを閉じる前に、各Curlハンドルから必要なすべての情報を抽出していることを確認してください。コンテンツ、エラー、 http_codeの構造化されたコレクションにより、大規模な同時リクエストを効率的に管理し、その後のビジネス処理のための強固な基盤を築くことができます。
簡単に再利用するために、このコードを一般的な関数にパッケージ化する必要がありますか?