【PHP8.x】CURLINFO_NUM_CONNECTS定数の使い方
CURLINFO_NUM_CONNECTS定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
CURLINFO_NUM_CONNECTS定数は、PHPのcURL拡張機能を用いてHTTPリクエストなどを実行した際に、その過程でどれだけの既存のネットワーク接続が再利用されたかを示す数値を表す定数です。この定数は、特にウェブサービスへのAPI連携やデータ収集など、繰り返しネットワーク通信を行うアプリケーションの開発において非常に重要になります。
具体的には、curl_getinfo()関数にこの定数を渡すことで、直前のcURL操作で「使い回された接続」の総数を取得できます。ネットワーク接続を確立する際には、相手のサーバーとの間でいくつかの手順(例えば、TCPハンドシェイクなど)が必要となり、これには時間とリソースが消費されます。すでに開いている接続を再利用することで、これらの初期コストを削減し、結果として通信の速度向上やサーバーへの負荷軽減に繋がります。
この定数の値を確認することで、開発者はcURLの設定やネットワーク通信の効率を評価できます。例えば、多くのリクエストを行っているにも関わらずこの値が低い場合、接続の再利用が十分にされていない可能性があり、CURLOPT_FORBID_REUSEのようなオプションが意図せず設定されていないか、またはCURLOPT_MAXCONNECTSで接続プールのサイズが適切に設定されているかなどを確認する手がかりとなります。システム全体のパフォーマンス最適化を考える上で、この情報は重要な指標の一つとなります。PHP 8以降の環境でcURL拡張機能が有効な場合に使用できます。
構文(syntax)
1<?php 2 3$ch = curl_init(); 4curl_setopt($ch, CURLOPT_URL, "https://www.example.com"); 5curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 6curl_exec($ch); 7$numConnects = curl_getinfo($ch, CURLINFO_NUM_CONNECTS); 8curl_close($ch); 9 10echo "Number of connections: " . $numConnects; 11 12?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
この定数は、cURLセッションが確立した接続の総数を整数で返します。
サンプルコード
PHP cURLでHTTPコードと接続数を取得する
1<?php 2 3/** 4 * 指定されたURLにHTTPリクエストを行い、そのHTTPステータスコードと確立された接続数を取得します。 5 * 6 * この関数は、cURLライブラリを使用して外部のWebサイトにアクセスし、 7 * 通信の結果として得られる基本的な情報を初心者にも分かりやすく提供します。 8 * 9 * @param string $url リクエストを送信するURL。例: 'https://www.example.com' 10 * @return array|false 成功した場合はHTTPステータスコードと接続数を含む連想配列。 11 * 失敗した場合はエラーメッセージを出力し、falseを返します。 12 */ 13function getUrlHttpStatusAndConnects(string $url) 14{ 15 // cURLセッションを初期化します。 16 // cURLは様々なプロトコル(HTTP, HTTPS, FTPなど)を使ってデータを転送するためのライブラリです。 17 $ch = curl_init(); 18 19 // cURLオプションを設定します。 20 // CURLOPT_URL: リクエストを送信するURLを指定します。 21 curl_setopt($ch, CURLOPT_URL, $url); 22 23 // CURLOPT_RETURNTRANSFER: curl_exec()の戻り値を文字列として受け取るように設定します。 24 // これをtrueにしないと、curl_exec()は直接結果を出力してしまいます。 25 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 26 27 // CURLOPT_FOLLOWLOCATION: HTTPヘッダーの"Location:"フィールドに従ってリダイレクトを追跡します。 28 // これにより、リダイレクトされた最終的なページの情報を取得できます。 29 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 30 31 // cURLセッションを実行し、HTTPリクエストを送信します。 32 // 結果(HTMLなど)は$responseに文字列として格納されます。 33 $response = curl_exec($ch); 34 35 // エラーチェックを行います。 36 // curl_errno()は直前のcURL操作のエラー番号を返します。エラーがない場合は0です。 37 if (curl_errno($ch)) { 38 // curl_error()は直前のcURL操作のエラーメッセージを返します。 39 echo 'cURLエラー発生: ' . curl_error($ch) . PHP_EOL; 40 curl_close($ch); // エラーが発生してもセッションは閉じます。 41 return false; 42 } 43 44 // HTTPステータスコードを取得します。 45 // CURLINFO_HTTP_CODEは、最後に受け取ったHTTPステータスコード(例: 200, 404, 500)を取得するための定数です。 46 // これはキーワードとして指定された情報です。 47 $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 48 49 // cURLが実行中に確立した接続の数を取得します。 50 // CURLINFO_NUM_CONNECTSは、cURLが接続を確立した回数を取得するための定数です。 51 // これはリファレンス情報として与えられた定数です。 52 $numConnects = curl_getinfo($ch, CURLINFO_NUM_CONNECTS); 53 54 // cURLセッションを閉じます。 55 // リソースを解放するために、使用後は必ず閉じることが推奨されます。 56 curl_close($ch); 57 58 // 取得した情報を連想配列として返します。 59 return [ 60 'http_code' => $httpCode, // HTTPステータスコード 61 'num_connects' => $numConnects, // 確立された接続数 62 'response_length' => strlen($response) // 取得したレスポンスボディのバイト数 63 ]; 64} 65 66// --- 以下はサンプルコードの実行部分です --- 67 68// テストするURLを指定します。 69// 実際にアクセス可能なURLに置き換えて試してみてください。 70$testUrl = 'https://www.example.com'; 71// $testUrl = 'https://httpbin.org/status/404'; // 404エラーの例 72// $testUrl = 'https://nonexistent.domain.xyz'; // 接続エラーの例 73 74echo "--- URL情報取得の開始 ---" . PHP_EOL; 75echo "対象URL: " . $testUrl . PHP_EOL; 76 77// 関数を呼び出して情報を取得します。 78$urlInfo = getUrlHttpStatusAndConnects($testUrl); 79 80// 取得結果に応じて情報を表示します。 81if ($urlInfo !== false) { 82 echo "--------------------------" . PHP_EOL; 83 echo "取得結果:" . PHP_EOL; 84 echo " HTTPステータスコード: " . $urlInfo['http_code'] . PHP_EOL; 85 echo " 確立された接続数: " . $urlInfo['num_connects'] . PHP_EOL; 86 echo " レスポンスボディの長さ: " . $urlInfo['response_length'] . " バイト" . PHP_EOL; 87 echo "--------------------------" . PHP_EOL; 88} else { 89 echo "URL情報の取得に失敗しました。" . PHP_EOL; 90} 91 92echo "--- URL情報取得の終了 ---" . PHP_EOL; 93 94?>
このサンプルコードは、PHPのcURLライブラリを用いて指定されたURLへHTTPリクエストを送信し、その結果からHTTPステータスコードと、リクエスト処理中に確立された接続数を取得する方法を解説しています。
まず、curl_init()関数でcURLセッションを初期化し、curl_setopt()関数でリクエスト先のURLや、レスポンスを文字列として受け取るための設定、リダイレクト追跡などのオプションを設定します。次にcurl_exec()関数で実際にHTTPリクエストを実行し、その結果を待ちます。リクエスト中にエラーが発生した場合は、curl_errno()やcurl_error()関数でエラー情報を取得し、適切な処理を行います。
リクエストが成功した場合、curl_getinfo()関数を使用し、CURLINFO_HTTP_CODE定数を用いて取得したHTTPステータスコード(例: 200 OK, 404 Not Foundなど)を取得します。さらに、今回のリファレンス情報であるCURLINFO_NUM_CONNECTS定数を用いて、cURLがリクエストの処理中に確立したネットワーク接続の数を取得します。通常は1回ですが、リダイレクトなどにより複数回接続が発生することもあります。最後にcurl_close()関数でcURLセッションを閉じ、取得したHTTPステータスコードと接続数をはじめとする情報を連想配列として返却します。
この関数は、引数としてリクエストを送信するURL($url)を文字列で受け取ります。成功した場合はHTTPステータスコードと接続数などを含む連想配列を返し、失敗した場合はエラーメッセージを出力し、ブール値のfalseを返します。
このサンプルコードでは、curl_init()で開始したcURLセッションを、処理の成功・失敗にかかわらずcurl_close()で必ず閉じ、システムリソースを適切に解放している点が重要です。ネットワーク通信は不安定なため、curl_errno()とcurl_error()による丁寧なエラーチェックは必須であり、これにより問題発生時に迅速な原因究明ができます。
また、CURLOPT_RETURNTRANSFERは取得結果を変数に格納するために、CURLOPT_FOLLOWLOCATIONはHTTPリダイレクトを自動で追跡するために必要です。これらのオプションや、CURLINFO_HTTP_CODE、CURLINFO_NUM_CONNECTSといった定数の意味を理解することで、より安全で正確な情報取得が可能になります。外部URLへのアクセスでは、信頼できるURLのみを使用し、セキュリティにも十分注意してください。
PHP cURLでHTTPコードと接続数を取得する
1<?php 2 3/** 4 * 指定されたURLに対してcURLリクエストを実行し、 5 * HTTPステータスコードと接続数を取得して表示します。 6 * 7 * この関数は、cURLの基本的な使用方法と、 8 * CURLINFO_RESPONSE_CODE および CURLINFO_NUM_CONNECTS 定数を使って 9 * リクエストに関する情報を取得する方法を示します。 10 * 11 * @param string $url リクエストを送信するターゲットURL。 12 * @return void 13 */ 14function getCurlRequestInfo(string $url): void 15{ 16 // cURLセッションを初期化します。 17 // curl_init() は新しい cURL ハンドルを返します。 18 $ch = curl_init(); 19 20 // cURLオプションを設定します。 21 // CURLOPT_URL: リクエストの送信先URL。 22 curl_setopt($ch, CURLOPT_URL, $url); 23 // CURLOPT_RETURNTRANSFER: true を設定すると、curl_exec() が結果を文字列で返します。 24 // false の場合、直接出力されます。 25 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 26 // CURLOPT_HEADER: true を設定すると、レスポンスヘッダも結果に含まれます。 27 // ここではボディのみが必要なため false に設定します。 28 curl_setopt($ch, CURLOPT_HEADER, false); 29 30 // cURLリクエストを実行します。 31 // 成功した場合はレスポンスボディが、失敗した場合は false が返されます。 32 $response = curl_exec($ch); 33 34 // cURLリクエストの実行中にエラーが発生したかを確認します。 35 if (curl_errno($ch)) { 36 echo "cURLエラーが発生しました: " . curl_error($ch) . PHP_EOL; 37 } else { 38 // リクエストが成功した場合、cURL_getinfo() を使用して追加情報を取得します。 39 40 // CURLINFO_RESPONSE_CODE: 最後のHTTPステータスコード (例: 200 OK, 404 Not Found)。 41 $httpStatusCode = curl_getinfo($ch, CURLINFO_RESPONSE_CODE); 42 43 // CURLINFO_NUM_CONNECTS: トランザクションを達成するために作成された新しい接続の数。 44 // 通常は1ですが、パフォーマンスが悪い場合などは複数になることがあります。 45 $numConnects = curl_getinfo($ch, CURLINFO_NUM_CONNECTS); 46 47 echo "--- cURLリクエスト情報 ---" . PHP_EOL; 48 echo "ターゲットURL: " . $url . PHP_EOL; 49 echo "HTTPステータスコード (CURLINFO_RESPONSE_CODE): " . $httpStatusCode . PHP_EOL; 50 echo "接続数 (CURLINFO_NUM_CONNECTS): " . $numConnects . PHP_EOL; 51 echo "------------------------" . PHP_EOL; 52 53 // レスポンスの最初の部分を表示する(オプション) 54 // echo "レスポンスの先頭部分: " . substr((string)$response, 0, 100) . "..." . PHP_EOL; 55 } 56 57 // cURLセッションを閉じ、リソースを解放します。 58 curl_close($ch); 59} 60 61// サンプルとして、一般的なウェブサイトに対して関数を実行します。 62$targetUrl = 'https://www.example.com'; 63getCurlRequestInfo($targetUrl); 64 65// 存在しないURLやエラーが発生しやすいURLの例 (コメントアウトを解除して試すことができます) 66// echo PHP_EOL; 67// getCurlRequestInfo('https://www.nonexistent-domain-123456789.com');
このサンプルコードは、PHPのcURL拡張機能を用いて指定されたURLへHTTPリクエストを送信し、その結果からHTTPステータスコードと接続数を取得・表示する基本的な方法を示します。
getCurlRequestInfo関数は、リクエスト先のURLを文字列($url)で受け取り、リクエスト情報を表示する役割を担い、特定の値を返しません(void)。
関数内では、まずcurl_init()でcURLセッションを初期化し、curl_setopt()でターゲットURLやレスポンスの取得方法を設定します。リクエストはcurl_exec()で実行され、エラーがなければcurl_getinfo()関数で詳細な情報を取得します。CURLINFO_RESPONSE_CODEは、ウェブサーバーから返されたHTTPステータスコード(例:200 OK、404 Not Found)を整数値で取得します。CURLINFO_NUM_CONNECTSは、このリクエストのために新たに確立されたネットワーク接続の数を整数値で取得します。最後にcurl_close()でセッションを閉じ、リソースを解放します。
PHPでcURL機能を利用するには、まずphp.iniでcURL拡張機能を有効にしてください。ネットワーク通信はエラーが発生しやすいため、curl_exec()実行後は必ずcurl_errno()とcurl_error()でエラーを確認し、適切に処理することが重要です。また、処理完了時にはcurl_close()でセッションのリソースを解放し、メモリリークを防ぎましょう。curl_getinfo()では、CURLINFO_RESPONSE_CODEでHTTPステータスコード、CURLINFO_NUM_CONNECTSでトランザクションに必要な接続数を取得できますが、CURLINFO_NUM_CONNECTSはリダイレクトなどで複数になる場合がある点に留意してください。