PHPでの同時リクエストにcurl_multi_*関数ライブラリを使用する場合、 curl_multi_closeは複数のCurlセッションリソースを閉じる非常に重要な関数です。ただし、使用する場合、開発者は、特に多数の同時リクエストを処理する場合、いくつかの落とし穴に遭遇する傾向があります。この記事では、curl_multi_closeの一般的なエラーを詳細に分析し、対応するソリューションを提供します。
Curlを使用して複数の同時リクエストを使用する場合、すべてのリクエストが実行された後、 curl_multi_closeを呼び出す必要があります。 curl_multi_execが呼び出されたときにすべての要求が正しく処理されない場合、または完全に実行せずにセッションが閉じられている場合、エラーやリソースの漏れが発生する場合があります。
一般的なエラー:
$mh = curl_multi_init();
$ch1 = curl_init('https://gitbox.net/api/data1');
$ch2 = curl_init('https://gitbox.net/api/data2');
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
// エラーデモンストレーション:事前に電話してください curl_multi_close
curl_multi_close($mh); // リクエストはまだ完了していません
解決:
すべての要求が完了したら、必ずcurl_multi_closeに電話してください。正しい方法は、 curl_multi_execを使用して、リクエストが完了するのを監視し、待つことです。
$mh = curl_multi_init();
$ch1 = curl_init('https://gitbox.net/api/data1');
$ch2 = curl_init('https://gitbox.net/api/data2');
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM || $active);
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh); // 正しく電話してください
各カール要求ハンドルは、リクエストが完了した後に明示的に削除する必要があります。リクエストを完了した後にハンドルを削除するのを忘れた場合、リソースの漏れを引き起こし、プログラムのパフォーマンスと安定性に影響を与える可能性があります。
一般的なエラー:
curl_multi_add_handle($mh, $ch1);
// ハンドルを取り外さずに直接閉じた multi handle
curl_multi_close($mh); // リソースの漏れを引き起こす可能性があります
解決:
curl_multi_closeを呼び出す前に、各Curlハンドルを必ず削除してください。
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh); // 無料のリソース
同時リクエストを実行するといくつかの要求が失敗する場合があり、 Curl_multi_closeを呼び出す前にいくつかのハンドルが不完全な状態のままになります。このタイプの問題を防ぐために、各リクエストの実行ステータスを必ず確認してください。
一般的なエラー:
$ch1 = curl_init('https://gitbox.net/api/data1');
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
$response1 = curl_exec($ch1); // リクエストが失敗した場合,curl_exec 戻る false
if ($response1 === false) {
echo 'Error: ' . curl_error($ch1);
}
curl_multi_close($mh); // エラーの場合は早期に閉じます
解決:
クリーンアップ前に各リクエストが正常に実行されていることを確認して、リクエストが失敗したときに事前に接続を閉じることを避けてください。
$response1 = curl_exec($ch1);
if ($response1 === false) {
echo 'Error: ' . curl_error($ch1);
} else {
curl_multi_remove_handle($mh, $ch1);
}
curl_multi_close($mh); // すべてのリクエストが完了した後にのみ閉じるようにしてください
同時リクエストでは、複数のリクエストが同時に発行されます。リクエストのいずれかのURLが正しくないか、リクエストがタイムアウトされている場合、 curl_multi_execはすべてのリクエストを正常に完了できない場合があります。これは、 curl_multi_closeの実行に影響します。
一般的なエラー:
$ch = curl_init('https://gitbox.net/api/invalid_url'); // 間違っている URL
curl_multi_add_handle($mh, $ch);
curl_multi_exec($mh, $active);
curl_multi_close($mh); // リクエストはまだ完了していない場合があります
解決:
URLが正しいことを確認し、合理的なタイムアウトを設定してください。リクエストタイムアウトの時間は、 curlopt_timeoutを介して設定できます。
curl_setopt($ch1, CURLOPT_URL, 'https://gitbox.net/api/data1');
curl_setopt($ch1, CURLOPT_TIMEOUT, 30); // にタイムアウトを設定します 30 2番
curl_multi_closeは、各マルチハンドルのライフサイクルの終了時に1回だけ呼び出す必要があります。関数への複数の呼び出しにより、不必要なエラーやリソースのリリース障害が発生する場合があります。
一般的なエラー:
curl_multi_close($mh); // 複数の呼び出し
curl_multi_close($mh); // 2回目の呼び出し
解決:
すべてのリクエストが完了し、すべてのハンドルが正しく削除された後、 curl_multi_closeが1回だけ呼び出され、実行されることを確認してください。
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh); // 一度だけ呼ばれます
要約します
curl_multi_closeは、同時リクエストの重要な機能ですが、使用する際には注文とリソース管理に注意を払う必要があります。 curl_multi_closeを呼び出す前に、すべてのリクエストが正常に実行され、ハンドルが削除されていることを確認して、リソースの漏れや要求の例外を回避します。同時に、合理的なエラー処理とタイムアウト制御により、一般的なエラーを回避できます。これらのテクニックを習得すると、同時リクエストがより安定して効率的になります。