PHPでは、 Curlは非常に強力なライブラリであり、ネットワークリクエストの処理に広く使用されています。効率的な同時リクエストを達成するために、PHPはcurl_multi_*シリーズ関数を提供し、複数のHTTP要求を同時に開始できるようにします。その中で、 curl_multi_closeは複数のCurlセッションハンドルを閉じるために使用される関数ですが、不適切に使用すると、接続の例外またはリソースの漏れが発生する可能性があります。この記事では、そのような問題を回避するためにcurl_multi_closeを正しく使用する方法について詳しく説明します。
PHPでは、 curl_multi_*シリーズ関数を使用して、複数のCurlセッションハンドルの同時操作を管理します。 curl_multi_initは、curlハンドルのコレクションを初期化するために使用され、 curl_multi_add_handleはコレクションに単一のcurlハンドルを追加するために使用され、 curl_multi_execはすべてのセッションを実行するために使用されます。
同時リクエストが終了した後、これらのセッションを閉じることが非常に重要です。 curl_multi_closeは、 curl_multi_initで初期化されたすべてのハンドルを解放するために使用されます。ただし、ハンドルを閉じるタイミングと順序は重要であり、適切に操作されない場合、接続の例外を引き起こす可能性があります。
curl_multi_closeを使用した後に接続の例外をスローしないようにするには、次のベストプラクティスに従う必要があります。
curl_multi_closeを呼び出す前に、まずすべてのCurlリクエストが完了したことを確認する必要があります。すべてのリクエストがcurl_multi_execを使用して処理されたかどうかを継続的に確認できます。
$multi_handle = curl_multi_init();
$ch1 = curl_init('https://gitbox.net/api/endpoint1');
$ch2 = curl_init('https://gitbox.net/api/endpoint2');
// ハンドルを追加します
curl_multi_add_handle($multi_handle, $ch1);
curl_multi_add_handle($multi_handle, $ch2);
// リクエストを実行します
$running = null;
do {
curl_multi_exec($multi_handle, $running);
} while ($running > 0);
// 結果を取得します
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);
// ハンドルを閉じます
curl_multi_remove_handle($multi_handle, $ch1);
curl_multi_remove_handle($multi_handle, $ch2);
// 無料のリソース
curl_multi_close($multi_handle);
上記のコードでは、 curl_multi_execを使用して、すべてのリクエストが完了したことを確認します。 curl_multi_closeは、すべての要求が完了した後にのみ、複数のCurlセッションを閉じるために呼び出されます。
curl_multi_closeを呼び出す前に、 curl_multi_remove_handleを介してすべてのcurlハンドルを削除するようにしてください。これらのハンドルが正しく削除されない場合、接続リークまたは例外が発生する可能性があります。
curl_multi_remove_handle($multi_handle, $ch1);
curl_multi_remove_handle($multi_handle, $ch2);
エラーとタイムアウトは、同時リクエストの一般的な問題です。 CURL_GETINFOとCURL_ERRNOを使用して、各要求のステータスを確認して、接続を閉じる前にすべての可能なエラーが処理されることを確認できます。
if (curl_errno($ch1)) {
echo 'Error: ' . curl_error($ch1);
} else {
echo 'Response 1: ' . $response1;
}
if (curl_errno($ch2)) {
echo 'Error: ' . curl_error($ch2);
} else {
echo 'Response 2: ' . $response2;
}
curl_multi_closeを適切に使用すると、PHPプログラムからの同時リクエストを、接続の例外をスローすることなく効率的に閉じることができます。 curl_multi_closeを呼び出す前に覚えておいてください:
すべてのリクエストが完了したことを確認してください。
すべてのハンドルを正しく削除します。
処理リクエストのエラーとタイムアウト。
これらのベストプラクティスに従うことにより、 Curl_multi_closeが複数のCurlセッションを閉じることによって引き起こされる接続の例外を回避し、プログラムの安定性と効率を改善できます。