PHPでは、 CurlはHTTPリクエストと処理応答を送信するための非常に強力なライブラリです。同時リクエストを作成するとき、通常、 curl_multi_*関数を使用してマルチスレッドを実行します。リクエストの数が増えるにつれて、デバッグとトラブルシューティングエラーが特に重要になります。この記事では、 curl_multi_close関数とcurl_errorを使用して、マルチスレッドリクエストのエラーを効果的にトラブルシューティングする方法について説明します。
curl_multi_*シリーズ関数は、複数のHTTP要求を同時に開始するPHPの関数です。単一のcurl_execとは異なり、 curl_multi_*は一度に複数のリクエストを実行して応答を処理できます。そのコア関数は次のとおりです。
curl_multi_init() :curl複数のハンドルを初期化します
curl_multi_add_handle() :複数のハンドルに単一のハンドルを追加します
curl_multi_exec() :追加されたすべてのCurl要求を実行します
curl_multi_getContent() :各curlリクエストの応答コンテンツを取得します
curl_multi_remove_handle() :複数のハンドルから単一のハンドルを削除します
curl_multi_close() :すべてのcurlリクエストを閉じます
curl_multi_closeは、主にすべてのリクエストが実行された後、マルチハンドルリソースを閉じるために主に使用されますが、 curl_errorはcurl要求でエラー情報を取得するために使用されます。マルチスレッドリクエストでは、通常、複数のリクエストが同時に処理され、エラーがすぐに表示されない場合があります。これら2つの機能を合理的に組み合わせることで、エラーをキャッチしてトラブルシューティングするのに役立ちます。
まず、Curlマルチハンドルを初期化し、リクエストごとに独立したカールハンドルを作成する必要があります。
$mh = curl_multi_init(); // 複数のハンドルを初期化します
$urls = [
"https://example.com/api/endpoint1",
"https://example.com/api/endpoint2",
"https://example.com/api/endpoint3",
];
$curlHandles = [];
foreach ($urls as $index => $url) {
$ch = curl_init($url); // シングルを初期化します cURL ハンドル
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$curlHandles[$index] = $ch;
curl_multi_add_handle($mh, $ch); // 将ハンドル添加到多ハンドル中
}
curl_multi_execを使用してすべての要求を実行し、実行ステータスを監視します。
$running = null;
do {
curl_multi_exec($mh, $running); // リクエストを実行します
curl_multi_select($mh); // 操作が完了するのを待ちます
} while ($running > 0);
すべてのリクエストが完了したら、 curl_multi_getContentを介して各要求の応答コンテンツを取得し、 curl_errorを使用してリクエストが失敗したかどうかを確認できます。
foreach ($curlHandles as $index => $ch) {
$response = curl_multi_getcontent($ch); // 応答コンテンツを取得します
if (curl_errno($ch)) {
// エラーメッセージをキャプチャします
$error_msg = curl_error($ch);
echo "聞く {$urls[$index]} エラーが発生しました: $error_msg\n";
} else {
echo "聞く {$urls[$index]} 成功,応答コンテンツ: $response\n";
}
curl_multi_remove_handle($mh, $ch); // 从多ハンドル中移除
curl_close($ch); // 关闭单个ハンドル
}
最後に、 curl_multi_closeを使用して複数のハンドルを閉じてリソースを解放します。
curl_multi_close($mh); // 关闭多ハンドル
APIリクエストのリストがあり、同時に処理する場合、特定のリクエストの障害に遭遇する可能性があるとします。上記の方法を介して、エラーをキャッチしてエラーメッセージを印刷できます。一般的なエラーには、DNS解像度の障害、接続タイムアウトなどが含まれます。通常、 curl_errorは、エラーの特定の原因を特定するのに役立ちます。
curl_multi_closeとcurl_errorを使用して、マルチスレッドリクエストのエラーチェックと協力することは、非常に効果的なデバッグ方法です。要求ごとにエラー情報を合理的にキャプチャすることにより、同時リクエストで発生する問題をすばやく見つけて解決できます。同時リクエストを処理するときは、コードを明確かつ簡潔に保ち、過度のネストと複製コードを避けるようにしてください。