Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】CURLINFO_CONNECT_TIME_T定数の使い方

CURLINFO_CONNECT_TIME_T定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

CURLINFO_CONNECT_TIME_T定数は、PHPのcURL拡張機能において、ネットワーク接続の確立にかかった時間に関する情報を取得するために使用される定数です。この定数は、指定されたURLへの接続が成功するまでに要した時間を測定する際に利用されます。

Webアプリケーションが外部のAPIやデータベース、他のWebサーバーなどと通信を行う際、その接続にかかる時間は全体のパフォーマンスに大きな影響を与えます。CURLINFO_CONNECT_TIME_T定数をcurl_getinfo()関数と組み合わせて使用することで、実際にTCPハンドシェイクやSSL/TLSハンドシェイクといった接続確立のプロセスにどれくらいの時間がかかったかを、秒単位の浮動小数点数として正確に取得できます。

これにより、例えばネットワークの遅延が原因で通信が遅いのか、それともサーバー側の処理に時間がかかっているのかといった問題の切り分けに役立てることができます。取得した接続時間データは、システム監視、パフォーマンスチューニング、およびトラブルシューティングの重要な指標となります。この定数を利用することで、プログラムが外部リソースとの接続にどの程度の時間を費やしているかを詳細に把握し、より堅牢で効率的なシステムを構築するための洞察を得ることが可能になります。

構文(syntax)

1<?php
2$ch = curl_init("https://www.example.com");
3curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
4curl_exec($ch);
5$connect_time_microseconds = curl_getinfo($ch, CURLINFO_CONNECT_TIME_T);
6curl_close($ch);
7?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

この定数は、PHPのcURL拡張機能で、接続が確立されるまでにかかった時間を秒単位で返します。

サンプルコード

PHP cURLでHTTPコードと接続時間取得

1<?php
2
3/**
4 * 指定されたURLへのHTTPリクエストを実行し、そのステータスコードと接続時間を取得します。
5 *
6 * この関数はCURLINFO_HTTP_CODE (キーワードに関連) と
7 * CURLINFO_CONNECT_TIME_T (リファレンス情報) の両方を利用して、
8 * HTTP通信の基本的な情報を取得する方法を示します。
9 *
10 * @param string $url リクエストを送信するURL。
11 * @return array リクエストの結果を含む連想配列。
12 *               成功時には 'http_code' (int) と 'connect_time_us' (int) を含みます。
13 *               失敗時には 'error' (string) と 'errno' (int) を含みます。
14 */
15function getCurlRequestInfo(string $url): array
16{
17    // cURLセッションを初期化します。
18    $ch = curl_init();
19
20    if ($ch === false) {
21        // cURL初期化に失敗した場合
22        return ['error' => 'cURLセッションの初期化に失敗しました。', 'errno' => -1];
23    }
24
25    // 転送オプションを設定します。
26    // CURLOPT_URL: リクエストを送信するURLを設定します。
27    curl_setopt($ch, CURLOPT_URL, $url);
28    // CURLOPT_RETURNTRANSFER: curl_exec() が結果を文字列として返すように設定します。
29    // true にしない場合、通常は直接出力されます。
30    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
31    // CURLOPT_CONNECTTIMEOUT: 接続フェーズで待機する最大秒数を設定します。
32    // この例ではシンプルさを保つため設定しませんが、実運用では重要です。
33    // curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
34
35    // cURLセッションを実行し、レスポンスを取得します。
36    $response = curl_exec($ch);
37
38    $info = [];
39    if ($response === false) {
40        // リクエストの実行中にエラーが発生した場合
41        $info['error'] = curl_error($ch); // エラーメッセージを取得
42        $info['errno'] = curl_errno($ch); // エラーコードを取得
43    } else {
44        // HTTPステータスコードを取得します。
45        // CURLINFO_HTTP_CODE: 最終的に受信したHTTPステータスコード (例: 200, 404)。
46        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
47        $info['http_code'] = $httpCode;
48
49        // 接続にかかった時間 (マイクロ秒単位) を取得します。
50        // CURLINFO_CONNECT_TIME_T: 接続が完了するまでの総時間(マイクロ秒単位)。
51        // PHP 7.3.0 以降で利用可能です。
52        // 戻り値は int 型です。
53        $connectTimeUs = curl_getinfo($ch, CURLINFO_CONNECT_TIME_T);
54        $info['connect_time_us'] = $connectTimeUs;
55    }
56
57    // cURLセッションを閉じ、リソースを解放します。
58    curl_close($ch);
59
60    return $info;
61}
62
63// --------------------------------------------------------------------------
64// サンプルコードの実行例 (単体で動作可能にするため)
65// --------------------------------------------------------------------------
66
67// アクセスするURLを指定します。
68$targetUrl = 'https://example.com'; // 任意のURLに変更して試すことができます。
69
70echo "URL: " . $targetUrl . " へのリクエスト情報を取得中..." . PHP_EOL;
71
72// 関数を呼び出して情報を取得します。
73$requestInfo = getCurlRequestInfo($targetUrl);
74
75// 取得した結果を表示します。
76if (isset($requestInfo['error'])) {
77    echo "エラーが発生しました: " . $requestInfo['error'] . " (エラーコード: " . $requestInfo['errno'] . ")" . PHP_EOL;
78} else {
79    echo "HTTPステータスコード: " . $requestInfo['http_code'] . PHP_EOL;
80    echo "接続にかかった時間: " . $requestInfo['connect_time_us'] . " マイクロ秒" . PHP_EOL;
81    echo "(約 " . round($requestInfo['connect_time_us'] / 1_000_000, 4) . " 秒)" . PHP_EOL;
82}

このサンプルコードは、PHPのcURL拡張機能を利用して、指定されたURLへのHTTPリクエストを実行し、その結果としてHTTPステータスコードとサーバーへの接続時間を取得する方法を示しています。

getCurlRequestInfo関数は、リクエストを送信するURLを$url(文字列)として引数に受け取ります。関数内では、まずcurl_init()でcURLセッションを初期化し、curl_setopt()でターゲットURLなどの必要なオプションを設定します。その後、curl_exec()で実際にHTTPリクエストを実行します。

リクエストが成功した場合、curl_getinfo()関数を使って、最終的なHTTPステータスコードと接続にかかった時間を取得します。CURLINFO_HTTP_CODEは、リクエストに対するサーバーからの応答が成功(例: 200)か、エラー(例: 404)かといった状態を示す整数値です。一方、CURLINFO_CONNECT_TIME_Tは、サーバーへの接続が完了するまでの総時間をマイクロ秒単位で示す整数値であり、システムのパフォーマンス分析に役立ちます。

処理の完了後にはcurl_close()でcURLセッションを閉じ、使用したリソースを解放します。戻り値は連想配列で、成功時には取得したHTTPステータスコードと接続時間が、失敗時にはエラーメッセージとエラーコードが含まれます。このコードは、外部APIの監視やウェブサイトの応答速度計測など、HTTP通信の詳細な情報を取得する際に活用できます。

このサンプルコードはcURLの基本的な利用方法とエラーハンドリングの重要性を示しています。特に、CURLINFO_CONNECT_TIME_TはPHP 7.3.0以降で利用可能であり、戻り値は接続にかかった時間をマイクロ秒単位の整数で示しますので、古いPHPバージョンで実行する際にはご注意ください。また、実運用においては、CURLOPT_CONNECTTIMEOUTCURLOPT_TIMEOUTといったオプションで適切なタイムアウト時間を設定し、ネットワーク状況によりプログラムが長時間停止するのを防ぐことが非常に重要です。curl_exec()が失敗した際には、curl_error()curl_errno()を用いて詳細なエラー情報を取得し、問題解決に役立ててください。利用後は必ずcurl_close()でリソースを解放することも忘れないでください。

PHP curl_infoで接続時間を取得する

1<?php
2
3/**
4 * 指定されたURLへのTCP接続にかかった時間を計測し、結果を表示します。
5 *
6 * CURLINFO_CONNECT_TIME_T は、cURLセッションがリモートホストへのTCP接続を確立するのにかかった時間
7 * (マイクロ秒)を返します。これはDNS解決やプロキシ接続などが完了し、
8 * 実際にデータ転送が可能になるまでの時間の一部です。
9 * 戻り値は int 型です。
10 *
11 * @param string $url 計測対象のURL
12 * @return void
13 */
14function measure_curl_connect_time(string $url): void
15{
16    // cURLセッションを初期化します
17    $ch = curl_init();
18
19    // 初期化に失敗した場合はエラーメッセージを表示して終了します
20    if ($ch === false) {
21        echo "エラー: cURLセッションの初期化に失敗しました。\n";
22        return;
23    }
24
25    // 接続先のURLを設定します
26    curl_setopt($ch, CURLOPT_URL, $url);
27    // 実行結果を文字列で返すように設定します (画面には直接表示しません)
28    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
29    // ボディのデータは必要ないので、取得しないように設定します(処理の軽量化)
30    curl_setopt($ch, CURLOPT_NOBODY, true);
31    // リダイレクトを自動的に追跡しないように設定します (計測のため)
32    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
33
34    echo "URL: " . $url . "\n";
35    echo "cURLリクエストを実行中...\n";
36
37    // cURLリクエストを実行します
38    $response = curl_exec($ch);
39
40    // リクエストの実行に失敗した場合はエラーメッセージを表示します
41    if ($response === false) {
42        echo "エラー: cURLリクエストの実行に失敗しました。 " . curl_error($ch) . "\n";
43    } else {
44        // CURLINFO_CONNECT_TIME_T 定数を使って、接続にかかった時間(マイクロ秒)を取得します
45        // この定数はPHP 7.0.0で追加されました。戻り値は int 型です。
46        $connectTimeMicroseconds = curl_getinfo($ch, CURLINFO_CONNECT_TIME_T);
47
48        if ($connectTimeMicroseconds !== false) {
49            echo "TCP接続にかかった時間: " . $connectTimeMicroseconds . " マイクロ秒\n";
50            // マイクロ秒を秒に変換して表示します
51            echo "TCP接続にかかった時間: " . ($connectTimeMicroseconds / 1_000_000) . " 秒\n";
52        } else {
53            echo "エラー: CURLINFO_CONNECT_TIME_T の情報が取得できませんでした。\n";
54        }
55    }
56
57    // cURLセッションを閉じ、リソースを解放します
58    curl_close($ch);
59}
60
61// サンプルとして、PHPの公式サイトへのTCP接続時間を計測します。
62// このコードを実行するには、インターネットへの接続が必要です。
63measure_curl_connect_time("https://www.php.net");

PHP 8で利用できるCURLINFO_CONNECT_TIME_Tは、cURL拡張機能を通じてリモートサーバーへのTCP接続にかかった時間を計測するための定数です。この定数はcurl_getinfo()関数と組み合わせて使用され、cURLセッションがリモートホストとのTCP接続を確立するのに要した時間(マイクロ秒)を取得できます。具体的には、DNS解決やプロキシ接続などが完了し、実際にデータ転送が可能になるまでの時間の一部を指します。

curl_getinfo($ch, CURLINFO_CONNECT_TIME_T)のように呼び出すと、整数型(int)の戻り値として、その時間がマイクロ秒単位で返されます。もし情報の取得に失敗した場合はfalseが返されることがあります。

提供されたサンプルコードは、measure_curl_connect_time関数を用いて、指定されたURLへのTCP接続時間を計測する一連の流れを示しています。まずcurl_init()でcURLセッションを初期化し、curl_setopt()で接続先のURLやデータ取得に関するオプションを設定します。その後、curl_exec()で実際にリクエストを実行し、その結果に対してcurl_getinfo()関数とCURLINFO_CONNECT_TIME_Tを使って接続時間を取得します。取得した時間はマイクロ秒と秒の両方で表示され、最後にcurl_close()でセッションを閉じてリソースを解放します。この機能は、ネットワーク通信のパフォーマンス測定やボトルネックの特定に役立ちます。

このサンプルコードは、CURLINFO_CONNECT_TIME_T定数を用いて、リモートホストへのTCP接続確立にかかる時間をマイクロ秒で計測します。この時間にはDNS解決やプロキシ接続などが含まれますが、データ転送そのものは含まれないため、全体の通信時間とは異なる点にご注意ください。取得される値は整数型なので、秒単位で表示するには1,000,000で割る計算が必要です。

コード内のエラーハンドリングは重要で、curl_init()curl_exec()の失敗時だけでなく、curl_getinfo()が情報を取得できない場合もfalseを返すため、常に結果を確認してください。また、curl_close()によるcURLセッションのリソース解放は、メモリリークを防ぐ上で必須の処理です。この定数はPHP 7.0.0以降で利用可能ですので、実行環境のバージョンを確認してください。正確な接続時間計測のためには、CURLOPT_NOBODYでボディ取得をスキップし、CURLOPT_FOLLOWLOCATIONでリダイレクトを追跡しない設定が推奨されます。

関連コンテンツ

関連IT用語

関連プログラミング言語