Curlは、URLリクエスト用のPHPの強力なツールです。 Curlを使用することにより、さまざまなサーバーと通信し、GETを実行し、リクエストを投稿し、ファイルをダウンロードし、フォームデータを送信します。Curlはセッション(セッション)を使用して要求された接続とリソースを管理します。通常、 curl_init()を介してセッションを初期化し、 curl_close()を介して閉じます。
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/api/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
上記のコードでは、リクエストを送信するたびにCurlセッションを初期化して閉じます。これは単一のリクエストでは問題ありませんが、頻繁にセッションの初期化とシャットダウンは、多数のリクエストを送信する必要がある場合にパフォーマンスに影響を与える可能性があります。
Curl_init()が呼び出されるたびに、PHPは新しいメモリを割り当て、関連するリソースを初期化します。また、 Curl_Close()が呼び出されるたびに、これらのリソースがリリースされます。これらの操作の頻繁な実行は、特に繰り返しの初期化とシャットダウンがシステムの負担を増加させる可能性のある高い並行性環境では、複数のリクエストに対して特に非効率的です。
// セッションを複数回初期化および閉鎖します
$ch1 = curl_init();
curl_setopt($ch1, CURLOPT_URL, "https://gitbox.net/api/endpoint1");
$response1 = curl_exec($ch1);
curl_close($ch1);
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, "https://gitbox.net/api/endpoint2");
$response2 = curl_exec($ch2);
curl_close($ch2);
上記のコードは、各要求間でcurl_init()とcurl_close()を実行します。これは、複数のリクエストを処理するときに時間とメモリを無駄にします。
コード効率を改善するために、長く接続されたCurlセッションを使用できます。このアプローチでは、Curlセッションを1回初期化するだけで、その後、 Curl_Setopt()を介して要求されたURLおよびその他のパラメーターを毎回再活性化することなく動的に変更する必要があります。
Curlリソースをループに保持し、各リクエストの前にURLおよびその他のオプションのみを更新できます。この方法は、 curl_init()とcurl_close()への呼び出し数を大幅に削減し、それにより効率が向上します。
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 最初のリクエスト
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/api/endpoint1");
$response1 = curl_exec($ch);
// 2番目のリクエスト
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/api/endpoint2");
$response2 = curl_exec($ch);
curl_close($ch);
上記のコードでは、 curl_init()とcurl_close()を1回だけ呼び出し、urlはcurl_setopt()を介して動的に変更されました。この方法は、セッションの初期化と閉鎖の繰り返しを回避し、コード効率を向上させます。
多数のリクエストを送信する必要がある場合、PHPのcurl_multi_*関数は複数のリクエストを同時に送信するのに役立ち、効率をさらに向上させます。 curl_multi_init()は、複数のCurlリソースを初期化することができ、個別のCurlセッションを頻繁に開閉することなく、複数のリクエストを並行して送信できます。
// 初期化 cURL バッチセッション
$mh = curl_multi_init();
// 複数を作成します cURL セッション
$ch1 = curl_init("https://gitbox.net/api/endpoint1");
$ch2 = curl_init("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);
} while ($status == CURLM_CALL_MULTI_PERFORM || $active);
// 応答を取得します
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);
// 閉鎖 cURL セッション
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
curl_multi_*関数を使用すると、毎回Curlセッションを初期化して閉じることなく、複数のリクエストを同時に送信できます。これにより、効率が向上するだけでなく、複数のリクエストを同時に処理でき、待ち時間を大幅に短縮できます。
各要求でcurl_init()とcurl_close()を呼び出すことを避け、代わりに長い接続またはバッチ要求を使用することにより、コードの実行効率を効果的に改善できます。特に、多数のリクエストが必要な場合、 curl_multi_*関数を使用すると、プロセス全体をさらに高速化し、リソースの消費を削減できます。
これらの方法を使用すると、Curlを使用してHTTP要求を送信するときにパフォーマンスを大幅に最適化し、効率的なPHPプログラミングのための強固な基盤を築くことができます。