開発では、複数のHTTP要求を同時に開始する必要がある状況に遭遇する場合があります。 PHPのCurlライブラリは、 Curl_multi_*関数である並行して複数のHTTP要求を開始するための非常に便利な方法を提供します。 curl_multi_add_handleおよびcurl_multi_closeは、このタイプの操作における2つの重要な機能です。この記事では、複数のCurl要求管理のためにそれらを正しく使用する方法について説明します。
Curlは、サーバーにリクエストを送信して応答を取得するためのツールです。 HTTP、HTTP、FTPなどの複数のプロトコルをサポートします。PHPでは、CURLは一連の機能を介して動作できます。最も一般的に使用される機能には、 curl_init 、 curl_setopt 、 curl_execが含まれます。
curl_multi_add_handle関数は、複数のCurlセッションハンドルを複数のCurl処理プールに追加するために使用されます。これにより、複数のリクエストを並行して処理できるため、特に複数のHTTPリクエストを送信する必要がある場合に効率が向上します。
// 複数を初期化します cURL セッション
$ch1 = curl_init('https://gitbox.net/api/resource1');
$ch2 = curl_init('https://gitbox.net/api/resource2');
// それぞれをセットアップします cURL 要求されたオプション
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
// どのくらいの初期化 cURL ハンドル
$multiHandle = curl_multi_init();
// 意思 cURL ハンドルに追加到多重 cURL ハンドル中
curl_multi_add_handle($multiHandle, $ch1);
curl_multi_add_handle($multiHandle, $ch2);
// リクエストを実行します
do {
$status = curl_multi_exec($multiHandle, $active);
if ($active) {
// アクティビティリクエストが完了するのを待ちます
curl_multi_select($multiHandle);
}
} while ($active && $status == CURLM_OK);
// 応答データを取得します
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);
// 出力結果
echo "Response from resource1: $response1\n";
echo "Response from resource2: $response2\n";
// それぞれを閉じます cURL セッション
curl_multi_remove_handle($multiHandle, $ch1);
curl_multi_remove_handle($multiHandle, $ch2);
上記のコードでは、 curl_multi_add_handleは、複数のcurlハンドル$ multihandleに2つのcurlハンドル$ ch1と$ ch2を追加し、 curl_multi_execを介してこれらの要求を実行します。 curl_multi_selectは、リクエストが完了するのを待ち、それにより並列処理を実装します。
すべてのリクエストが完了したら、複数のカールハンドルを閉じる必要があります。この時点で、 curl_multi_close関数を使用します。この関数は、 curl_multi_initによって作成されたハンドルに関連するリソースをリリースします。
// リクエストを完了した後に閉鎖する金額 cURL ハンドル
curl_multi_close($multiHandle);
curl_multi_closeを使用した後、複数のCurlハンドルに関連するすべてのリソースがクリーニングされます。複数のカールハンドルを閉じる前に、追加されたすべてのカールハンドルを最初に削除する必要があります。そうしないと、リソースリークが発生することに注意してください。
curl_multi_add_handleとcurl_multi_closeを使用して複数のHTTP要求を管理する方法を示す完全な例を示します。
// 複数を初期化します cURL セッション
$ch1 = curl_init('https://gitbox.net/api/resource1');
$ch2 = curl_init('https://gitbox.net/api/resource2');
// 設定 cURL オプション
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
// どのくらいの初期化 cURL ハンドル
$multiHandle = curl_multi_init();
// に追加 cURL セッション到多重处理池
curl_multi_add_handle($multiHandle, $ch1);
curl_multi_add_handle($multiHandle, $ch2);
// 複数のリクエストを実行します
do {
$status = curl_multi_exec($multiHandle, $active);
if ($active) {
curl_multi_select($multiHandle); // リクエストが完了するのを待ちます
}
} while ($active && $status == CURLM_OK);
// 返されたコンテンツを取得します
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);
// 出力要求結果
echo "Response from resource1: $response1\n";
echo "Response from resource2: $response2\n";
// 取り除く cURL セッション
curl_multi_remove_handle($multiHandle, $ch1);
curl_multi_remove_handle($multiHandle, $ch2);
// いくら離れています cURL ハンドル
curl_multi_close($multiHandle);
このコードは、リクエストが完了した後、複数のHTTP要求を並行して複数のカールハンドルを閉じて閉じる方法を完全に示しています。