PHPで複数のリクエストにCurlを使用する場合、 CURL_MULTI_*一連の関数は、特に同時リクエストのシナリオで、プログラムのパフォーマンスを大幅に改善できます。ただし、多くの開発者は、これらの機能、特にcurl_multi_closeの使用を使用する場合、いくつかの重要なエラー処理とリソースのリリースの問題を無視する傾向があります。 curl_multi_closeが誤って呼ばれる場合、リソースの漏れ、パフォーマンスの問題、さらにはメモリオーバーフローの問題さえも引き起こす可能性があります。
この記事では、リソースの漏れやその他の潜在的な問題を回避するために、エラーを処理するときにcurl_multi_close関数を正しく使用する方法について詳しく説明します。
curl_multi_close関数は、複数のCurlセッションで初期化されたすべてのハンドルを閉じるPHP Curl拡張機能の関数です。 curl_multi_*関数を使用すると、複数のCurl要求を並行して実行できますが、 Curl_multi_closeは、リソースを解放するためにすべてのリクエストが完了した後、各Curlセッションを適切に閉じるために使用されます。
複数の同時リクエストを実行する場合、 curl_multi_initを使用してマルチセッションリソースを初期化し、 curl_multi_add_handleを使用してこのマルチセッションに個々のCurlセッションを追加する必要があります。リクエストが完了したら、 curl_multi_closeを呼び出して、マルチセッションリソースを閉じる必要があります。
コード例:
// どのくらいの初期化cURLセッション
$mh = curl_multi_init();
$ch1 = curl_init();
$ch2 = curl_init();
// 設定cURLオプション
curl_setopt($ch1, CURLOPT_URL, "https://gitbox.net/api/endpoint1");
curl_setopt($ch2, CURLOPT_URL, "https://gitbox.net/api/endpoint2");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
// 添加セッション到多重セッション资源中
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
// 複数のリクエストを実行します
do {
$status = curl_multi_exec($mh, $active);
if ($active) {
// リクエストが完了するのを待ちます
curl_multi_select($mh);
}
} while ($active && $status == CURLM_OK);
// データを取得して処理します。データを処理します
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);
// 閉鎖cURLセッション
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
// 最后閉鎖多重cURLセッション
curl_multi_close($mh);
エラー処理は、複数のリクエストの重要な部分です。複数のリクエストを実行すると、接続タイムアウト、無効な応答、サーバーエラーなど、さまざまなエラーが発生する可能性があります。リソースが発生したときにリリースがリリースされないことを避けるために、リクエストが成功したかどうかに関係なくリソースが適切に閉じられることを確認するために、トライキャッチを使用して例外をキャッチできます。
エラー処理コードの例:
try {
// どのくらいの初期化cURLセッション
$mh = curl_multi_init();
$ch1 = curl_init();
$ch2 = curl_init();
// 設定cURLオプション
curl_setopt($ch1, CURLOPT_URL, "https://gitbox.net/api/endpoint1");
curl_setopt($ch2, CURLOPT_URL, "https://gitbox.net/api/endpoint2");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
// 添加セッション到多重セッション资源中
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
// 複数のリクエストを実行します
do {
$status = curl_multi_exec($mh, $active);
if ($active) {
// リクエストが完了するのを待ちます
curl_multi_select($mh);
}
} while ($active && $status == CURLM_OK);
// 各リクエストの結果を確認してください
if ($status != CURLM_OK) {
throw new Exception("cURLリクエストが失敗しました,エラーコード:" . $status);
}
// データを取得して処理します。データを処理します
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);
// ここで返されたデータを処理します...
} catch (Exception $e) {
// エラー処理パーツ:ログエラーログ
error_log("リクエストが失敗しました:" . $e->getMessage());
} finally {
// エラーがあるかどうかを確認してください,リソースは正しくリリースされます
if (isset($mh)) {
// 閉鎖セッション资源
if (isset($ch1)) {
curl_multi_remove_handle($mh, $ch1);
curl_close($ch1);
}
if (isset($ch2)) {
curl_multi_remove_handle($mh, $ch2);
curl_close($ch2);
}
curl_multi_close($mh);
}
}
リクエストが完了した後にcurl_multi_closeが呼び出されない場合、PHPセッションはシステムリソースを占有し、メモリリークとパフォーマンスの問題が発生します。複数のリクエストの場合、閉鎖されていないカールハンドルが時間とともに蓄積し、プログラムの安定性に影響を与え、プロセスがクラッシュすることさえあります。したがって、 curl_multi_closeを正しく使用することが重要です。
通常、リソースリークは次の状況で発生します。
curl_multi_close関数を呼び出すのを忘れました。
エラーが発生すると、プログラムは最終的なブロックを入力してリソースをリリースできません。
ループまたは繰り返しのリクエストでは、新しいセッションが繰り返し作成されますが、古いセッションは閉じられていません。
これらの問題を回避するためのベストプラクティスは、エラーがある場合でもすべてのセッションを適切に閉じることができるように、トライキャッチ式構造を常に使用することです。
curl_multi_closeの適切な使用は、リソースの漏れやその他のパフォーマンスの問題を回避するための重要なステップです。同時リクエストの場合、エラー処理とリソース管理に常に注意を払う必要があります。 Try-Catch-Finally Structureを介した各要求後にリソースの正しいリリースを確保することで、高い並行性環境でのアプリケーションの安定性が保証されます。
実際の開発では、リクエストの失敗やその他のエラーの場合にリソースのシャットダウンを逃さないように、各カールセッションを常に管理するように注意する必要があります。この方法でのみ、複数のカール要求がより効率的で安定しているため、潜在的なメモリリークとパフォーマンスのボトルネックを回避できます。