【PHP8.x】CURLINFO_APPCONNECT_TIME_T定数の使い方
CURLINFO_APPCONNECT_TIME_T定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
CURLINFO_APPCONNECT_TIME_T定数は、PHPのcURL拡張機能において、リモートホストへのアプリケーション接続にかかった時間を表す定数です。これは、cURLがサーバーとのTCP接続を確立した後、SSL/TLSハンドシェイクやプロキシ認証などの通信準備が完了し、データの送受信を開始できる状態になるまでの経過時間を指します。
具体的には、curl_getinfo()関数にこの定数を指定することで、この時間情報をマイクロ秒単位の整数値として取得できます。この値は、ウェブサイトへのリクエストや外部APIとの連携など、cURLを利用したネットワーク通信を行うアプリケーションのパフォーマンス分析において非常に有用です。例えば、外部サービスからのデータ取得など、ネットワーク経由での処理速度が重要な場面で、接続にかかる時間を詳細に把握することができます。
これにより、通信のどの段階で時間がかかっているのかを特定しやすくなり、システムの応答性向上やトラブルシューティングに役立てることが可能です。システムエンジニアにとって、アプリケーションの効率的な運用をサポートする重要な指標の一つとなるでしょう。
構文(syntax)
1<?php 2$curl_handle = curl_init("https://www.example.com"); 3curl_exec($curl_handle); 4$appconnect_time_microseconds = curl_getinfo($curl_handle, CURLINFO_APPCONNECT_TIME_T); 5curl_close($curl_handle); 6?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP cURLでHTTPコードと接続時間を取得する
1<?php 2 3/** 4 * 指定されたURLにcURLリクエストを送信し、HTTPステータスコードと 5 * アプリケーション接続にかかった時間を取得します。 6 * 7 * cURLリクエストの基本フローと、特定のリクエスト情報を取得する方法を示します。 8 * 9 * @param string $url リクエストを送信するURL 10 * @return array{http_code: int, app_connect_time_us: int}|false 成功した場合はHTTPコードと接続時間を格納した配列、失敗した場合はfalse 11 */ 12function getWebsiteCurlInfo(string $url): array|false 13{ 14 // cURLセッションを初期化 15 $ch = curl_init(); 16 17 if ($ch === false) { 18 // cURL初期化失敗時のエラーハンドリング 19 error_log("cURLセッションの初期化に失敗しました。"); 20 return false; 21 } 22 23 // オプションを設定 24 curl_setopt($ch, CURLOPT_URL, $url); // リクエストを送信するターゲットURL 25 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // curl_exec() が結果を文字列で返すように設定 26 curl_setopt($ch, CURLOPT_TIMEOUT, 10); // タイムアウトを10秒に設定 27 // HTTPSサイトの場合に証明書の検証を無効にするオプション(開発・テスト目的以外では推奨されません) 28 // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 29 // curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 30 31 // cURLリクエストを実行し、レスポンスを取得 32 $response = curl_exec($ch); 33 34 // cURL実行中にエラーが発生したかチェック 35 if (curl_errno($ch)) { 36 $error_msg = curl_error($ch); 37 error_log("cURLエラーが発生しました: " . $error_msg); 38 curl_close($ch); 39 return false; 40 } 41 42 // cURLリクエストから情報を取得 43 // CURLINFO_HTTP_CODE: 最後に受信したHTTPステータスコード (例: 200, 404) を取得 44 $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 45 46 // CURLINFO_APPCONNECT_TIME_T: TLS/SSL ハンドシェイクが完了するまでの時間(マイクロ秒)を取得 47 // この値は、接続が確立され、アプリケーション層でデータ交換が可能になるまでの時間を示します。 48 $appConnectTimeUs = curl_getinfo($ch, CURLINFO_APPCONNECT_TIME_T); 49 50 // cURLセッションを閉じる(リソースを解放) 51 curl_close($ch); 52 53 // 取得した情報を連想配列として返す 54 return [ 55 'http_code' => (int)$httpCode, // HTTPステータスコード 56 'app_connect_time_us' => (int)$appConnectTimeUs // アプリケーション接続時間(マイクロ秒) 57 ]; 58} 59 60// この関数を実際に使用する例 61$targetUrl = 'https://www.google.com'; // 情報を取得したいウェブサイトのURLを設定してください 62$info = getWebsiteCurlInfo($targetUrl); 63 64if ($info !== false) { 65 echo "URL: " . $targetUrl . "\n"; 66 echo "HTTPステータスコード: " . $info['http_code'] . "\n"; 67 // マイクロ秒単位の時間を秒に変換して表示 68 echo "アプリケーション接続時間: " . ($info['app_connect_time_us'] / 1000000) . " 秒\n"; 69} else { 70 echo "URL " . $targetUrl . " から情報を取得できませんでした。\n"; 71} 72
PHPのこのサンプルコードは、指定したURLに対してcURLという機能を使ってウェブサイトへのリクエストを送信し、その通信に関する二つの重要な情報を取得する方法を示しています。
getWebsiteCurlInfoという関数は、引数としてリクエストを送るウェブサイトのURLを受け取ります。この関数は、まずcURLセッションを初期化し、ターゲットURLやレスポンスを文字列で受け取る設定などを行います。その後、実際にリクエストを実行し、問題がなければ、二つの重要な情報を取得します。
一つ目の情報として、CURLINFO_HTTP_CODE定数を用いて、サーバーから返されるHTTPステータスコード(例:成功を示す200やページが見つからないことを示す404など)を取得します。これはリクエストがどのように処理されたかを知る上で重要です。
二つ目の情報として、CURLINFO_APPCONNECT_TIME_T定数を用いて、アプリケーション接続にかかった時間、特にTLS/SSLハンドシェイクが完了するまでの時間をマイクロ秒単位で取得します。これは、サーバーとの安全な通信経路が確立されるまでにどれくらいの時間がかかったかを示し、ウェブサイトの接続パフォーマンスを把握するのに役立ちます。
関数はこれらの情報を含む連想配列を戻り値として返しますが、cURLの初期化失敗やリクエスト実行中にエラーが発生した場合はfalseを返します。このコードは、ウェブサイトとの通信状況をプログラムで確認する基本的な手法として、システムエンジニアを目指す方にとって有用な例となるでしょう。
cURLセッションはcurl_init()で開始後、処理完了時には必ずcurl_close()で閉じてリソースを解放してください。これはサーバーへの負担軽減やメモリリーク防止のため重要です。cURLの初期化や実行は失敗する可能性があるため、curl_init()の戻り値やcurl_errno()を使って常にエラーをチェックし、適切に処理を中断・報告する仕組みを取り入れることが安全なコードの基本です。サンプルコードでコメントアウトされているSSL証明書の検証無効化はセキュリティリスクを高めますので、本番環境では絶対に使用しないでください。CURLINFO_APPCONNECT_TIME_Tのように_Tが付く時間はマイクロ秒単位ですので、表示する際は秒への変換計算が必要です。CURLINFO_HTTP_CODEは通信の成否、CURLINFO_APPCONNECT_TIME_Tはパフォーマンス分析に活用できます。
PHP curl_infoでSSL接続時間を取得する
1<?php 2 3/** 4 * 指定されたURLへのcURLリクエストにおける、アプリケーション接続時間 5 * (SSL/SSHハンドシェイク完了までの時間)を表示します。 6 * 7 * この時間は、TCP接続が確立された後、セキュアな接続(HTTPSなど)のための 8 * TLS/SSLまたはSSHハンドシェイクが完了するまでの時間(マイクロ秒)を示します。 9 * PHP 8では、この定数CURLINFO_APPCONNECT_TIME_Tを使用することで、 10 * より高精度な時間情報(_Tサフィックス付きはマイクロ秒単位)を取得できます。 11 * 12 * @param string $url 接続情報を取得したいターゲットURL 13 * @return void 14 */ 15function displayCurlAppConnectTime(string $url): void 16{ 17 // cURLセッションを初期化します。これにより、ネットワークリクエストの準備が始まります。 18 $ch = curl_init(); 19 20 // cURL初期化に失敗した場合の処理 21 if ($ch === false) { 22 echo "エラー: cURLセッションの初期化に失敗しました。\n"; 23 return; 24 } 25 26 // cURLオプションを設定します。 27 // CURLOPT_URL: リクエストを送信するターゲットURLを指定します。 28 curl_setopt($ch, CURLOPT_URL, $url); 29 // CURLOPT_RETURNTRANSFER: cURL_exec()の実行結果を直接出力せず、文字列として戻り値で受け取るように設定します。 30 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 31 // CURLOPT_CONNECTTIMEOUT_MS: 接続が確立されるまでのタイムアウト時間をミリ秒単位で設定します。 32 // この時間を超えると接続試行を中止します。 33 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 5000); // 5秒でタイムアウト 34 35 // cURLリクエストを実行します。この時点で実際のネットワーク通信が行われます。 36 $response = curl_exec($ch); 37 38 // cURLリクエスト中にエラーが発生したか確認します。 39 if (curl_errno($ch)) { 40 echo 'cURLエラーが発生しました: ' . curl_error($ch) . "\n"; 41 curl_close($ch); // エラー時はcURLセッションを閉じて終了します。 42 return; 43 } 44 45 // CURLINFO_APPCONNECT_TIME_T を使用して、アプリケーション接続時間を取得します。 46 // この値は、TCP接続後、TLS/SSLまたはSSHハンドシェイクが完了するまでの時間を示し、マイクロ秒単位で返されます。 47 $appConnectTimeMicroseconds = curl_getinfo($ch, CURLINFO_APPCONNECT_TIME_T); 48 49 // cURLセッションを閉じます。これにより、使用したネットワークリソースが解放されます。 50 curl_close($ch); 51 52 echo "--- cURL アプリケーション接続時間の情報 ---\n"; 53 echo "対象URL: " . $url . "\n"; 54 55 if ($appConnectTimeMicroseconds !== false) { 56 echo "アプリケーション接続(SSL/SSHハンドシェイク完了まで)時間: " . $appConnectTimeMicroseconds . "マイクロ秒\n"; 57 // 初心者にも分かりやすいように、マイクロ秒から秒に変換して表示します。 58 echo "およそ " . round($appConnectTimeMicroseconds / 1_000_000, 4) . "秒\n"; 59 echo "この時間は、セキュアな接続(HTTPSなど)において、暗号化通信の準備にかかった時間を示します。\n"; 60 } else { 61 echo "エラー: アプリケーション接続時間の取得に失敗しました。\n"; 62 echo "(HTTP接続の場合や情報が利用できない場合は、値が0またはfalseになることがあります。)\n"; 63 } 64 echo "-----------------------------------------\n"; 65} 66 67// サンプルとして、セキュアなHTTPSサイト(Google)で関数を実行します。 68// これにより、SSLハンドシェイクにかかる時間が計測されます。 69displayCurlAppConnectTime("https://www.google.com"); 70 71?>
CURLINFO_APPCONNECT_TIME_Tは、PHP 8以降で提供されるcURL拡張機能の定数で、ネットワーク接続における「アプリケーション接続時間」を高精度(マイクロ秒単位)で取得するために使用されます。この時間は、TCP接続が確立された後に、TLS/SSLまたはSSHハンドシェイクが完了するまでの期間を示します。
サンプルコードは、指定されたURLへPHPのcURL拡張機能を使ってリクエストを実行し、その接続にかかったアプリケーション接続時間を計測して表示します。まずcurl_init()でcURLセッションを初期化し、curl_setopt()でターゲットURLや実行結果の受け取り方などを設定します。次にcurl_exec()で実際にネットワークリクエストを実行します。リクエスト完了後、curl_getinfo()関数にCURLINFO_APPCONNECT_TIME_T定数を渡すことで、SSL/SSHハンドシェイクの完了までにかかった時間をマイクロ秒単位で取得します。この時間は、特にHTTPSのようなセキュアな通信において、暗号化通信の準備にかかる重要な指標となります。curl_getinfo()関数は、第一引数にcURLリソース、第二引数に取得したい情報の種類を渡し、その情報の値(今回はマイクロ秒の時間)を返します。最後にcurl_close()でcURLセッションを閉じ、取得した時間を分かりやすく秒単位にも変換して表示しています。
CURLINFO_APPCONNECT_TIME_Tは、セキュアな接続(HTTPSなど)におけるSSL/SSHハンドシェイク完了までの時間をマイクロ秒単位で取得するPHP 8以降の定数です。HTTP接続では値が0となるか、情報が得られない場合がありますので、取得結果を必ず確認してください。cURL操作はネットワーク状況に依存するため、curl_init()、curl_exec()、curl_getinfo() の各ステップでエラーチェックを行い、問題発生時は適切な処理をしてください。処理の最後にcurl_close()を忘れずに呼び出し、使用したリソースを必ず解放してください。curl_getinfo()の戻り値は成功時に数値、失敗時にはfalseとなります。取得した値がfalseでないかを確認してから利用することが重要です。CURLOPT_CONNECTTIMEOUT_MSのようなタイムアウトオプションを設定し、長時間の待機によるプログラムの停止を防ぐことをお勧めします。