PHPでは、 curl_multi_*関数は、複数のHTTP要求を同時に送信するための効率的な方法を提供します。特に、 CURL_MULTI_INFO_READ関数は、複数のCURL要求を開始するときに返品データを管理および処理するのに役立ちます。この記事では、 curl_multi_info_readを使用して効率と精度を確保する場合、複数のCurl要求の返品データを完全に管理および処理する方法について詳しく説明します。
PHPでは、 Curl拡張機能はHTTP要求に豊富なAPIを提供します。複数のHTTP要求を開始する必要がある場合、 CURL_MULTI_*関数は通常、これらのリクエストを並行して実行するために使用されます。 curl_multi_execは複数のリクエストを実行するために使用され、 curl_multi_info_readは各要求とその返信データの実行情報を取得するために使用されます。
まず、 curl_multi_init()を使用してマルチカールハンドルを初期化し、各リクエストの個別のCurlハンドルを作成し、マルチカールハンドルに追加します。簡単な例を次に示します。
<?php
// 複数の初期化 cURL ハンドル
$multiCurl = curl_multi_init();
// 複数の個別を作成します cURL 聞くハンドル
$curlHandles = [];
$urls = ['https://gitbox.net/api/data1', 'https://gitbox.net/api/data2', 'https://gitbox.net/api/data3'];
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiCurl, $ch);
$curlHandles[] = $ch;
}
// リクエストを実行します
do {
$status = curl_multi_exec($multiCurl, $active);
if ($active) {
// イベントが完了するのを待ちます
curl_multi_select($multiCurl);
}
} while ($active && $status == CURLM_OK);
// 各リクエストの結果を処理します
foreach ($curlHandles as $ch) {
$response = curl_multi_getcontent($ch);
// 処理返品データ
echo $response . PHP_EOL;
// 关闭ハンドル
curl_multi_remove_handle($multiCurl, $ch);
curl_close($ch);
}
// 多くを閉じてください cURL ハンドル
curl_multi_close($multiCurl);
?>
上記のコードでは、各カールリクエストハンドルをcurl_multi_add_handleを介してmulti curlハンドル$ multicurlに追加し、 curl_multi_execを介してこれらの要求を同時に実行します。
curl_multi_info_read関数は、Multi-CURLハンドルから各要求の返品情報を取得するために使用されます。この関数を通じて、リクエストの実行ステータス、エラー情報、およびリクエストの返品コンテンツを取得できます。複数のリクエストの返されたデータを管理および処理するために使用する方法は次のとおりです。
<?php
// 多くが初期化され、実行されたと仮定します cURL 聞く(上記を参照してください)
// 获取每个聞く的执行信息
while ($done = curl_multi_info_read($multiCurl)) {
// 获取聞く状态
$status = $done['result'];
$ch = $done['handle'];
if ($status === CURLE_OK) {
// 聞く成功
$response = curl_multi_getcontent($ch);
echo "聞く成功,データを返します: " . $response . PHP_EOL;
} else {
// 聞く失败
echo "聞く失败,エラーメッセージ:" . curl_error($ch) . PHP_EOL;
}
// 移除已完成的ハンドル
curl_multi_remove_handle($multiCurl, $ch);
curl_close($ch);
}
// 多くを閉じてください cURL ハンドル
curl_multi_close($multiCurl);
?>
この例では、 curl_multi_info_readを使用して、各リクエストの返品情報を取得します。リクエストが成功した場合、 curl_multi_getContentを介して返されたデータを取得します。それ以外の場合は、エラーメッセージを印刷します。
複数の要求が並行して実行されると、各リクエストの返品データには異なる構造またはコンテンツがある場合があります。したがって、返されたデータを処理する場合、次の側面を考慮する必要があります。
データ形式のユニティ:すべての要求によって返されるデータが一貫していることを確認し、その後の処理を容易にします。たとえば、返されたデータをJSON形式に変換して均一に解析することを検討できます。
エラー処理:要求ごとに、リクエストの失敗を処理する必要があります。 curl_multi_info_readは、要求されたエラー情報を取得して、問題のデバッグと分析を支援できます。
非同期データ処理:場合によっては、データベースに堆積したり、他のAPI呼び出しを行ったりするなど、返されたデータをさらに非同期に処理する必要があります。この場合、キューシステムを使用するか、データをキャッシュに保存して後で処理することができます。
以下は、データ形式の処理とエラー処理を組み合わせた例です。
<?php
// 複数の実行が実行されたと仮定します cURL 聞く并获取了データを返します
while ($done = curl_multi_info_read($multiCurl)) {
$ch = $done['handle'];
$status = $done['result'];
// 检查聞く是否成功
if ($status === CURLE_OK) {
$response = curl_multi_getcontent($ch);
// 返されたと仮定します JSON データ
$data = json_decode($response, true);
if ($data === null) {
echo "分析 JSON データ失败:" . json_last_error_msg() . PHP_EOL;
} else {
// 处理データ
echo "成功获取データ:" . print_r($data, true) . PHP_EOL;
}
} else {
// 聞く失败,输出エラーメッセージ
echo "聞く失败,エラーメッセージ:" . curl_error($ch) . PHP_EOL;
}
// 移除并关闭ハンドル
curl_multi_remove_handle($multiCurl, $ch);
curl_close($ch);
}
curl_multi_close($multiCurl);
?>
このコードでは、 json_decodeを介して返されたJSONデータを解析し、解析エラーを処理します。
curl_multi_*関数は既に並行リクエストを許可していますが、高い並行性環境では、次の最適化測定値を考慮する必要があります。
バッチリクエスト:すべてのリクエストを一度に送信する代わりにバッチでリクエストを送信し、リソースの使い果たしやパフォーマンスの劣化につながる過度の同時リクエストを回避します。
リクエストタイムアウト設定:適切なタイムアウト制限を設定して、リクエストがブロックされ、他のリクエストの実行に影響を与えないようにします。 curlopt_timeoutまたはcurlopt_timeout_msを使用して、リクエストタイムアウトを設定します。
接続プーリング:CURLの接続マルチプレックスメカニズムを使用すると、接続を繰り返し確立するオーバーヘッドが減少します。 curlopt_forbid_reuseおよびcurlopt_fresh_connectを設定することにより、接続の多重化を最適化できます。
curl_multi_info_readおよびcurl_multi_*関数を使用すると、PHPは複数の並列HTTP要求を非常に効率的に管理および処理できます。実際のアプリケーションでは、リクエストの並行した実行に焦点を当てるだけでなく、返されたデータを効果的に処理して、処理の信頼性とパフォーマンスを確保する必要があります。
うまくいけば、この記事がPHPでcurl_multi_info_readを使用して複数のリクエストを管理し、返品データを処理する方法をよりよく理解するのに役立つことを願っています。
関連タグ:
cURL