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

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

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

作成日: 更新日:

基本的な使い方

CURLINFO_NAMELOOKUP_TIME_T定数は、PHPのcURL拡張機能において、リモートサーバーへの接続確立プロセス中に発生するDNS名前解決にかかった時間をマイクロ秒単位の整数値で表す定数です。

cURLは、Webサーバーなどと通信を行うための非常に強力なツールで、HTTPリクエストの送信やファイルのダウンロードなどに利用されます。インターネット上で特定のWebサイト(ドメイン名)にアクセスする際、コンピュータはそのドメイン名がどのIPアドレスに対応するかを問い合わせる必要があります。この一連の処理が「DNS名前解決」と呼ばれ、通信を開始するための最初の重要なステップです。

この定数は、そのDNS名前解決に要した具体的な時間を提供します。従来のCURLINFO_NAMELOOKUP_TIME定数が秒単位の浮動小数点数で時間を提供していたのに対し、CURLINFO_NAMELOOKUP_TIME_T定数は、より高精度なマイクロ秒単位の整数値として時間情報を提供します。

この情報を使うことで、curl_getinfo()関数を通じて、ネットワーク通信における名前解決の段階でどのくらいの時間がかかっているかを正確に把握できます。これは、アプリケーションの応答速度が遅い場合に、ネットワークのどこにボトルネックがあるのか、特にDNSサーバーの応答性や設定に問題がないかを調査するための重要な手がかりとなります。システムのパフォーマンスチューニングやトラブルシューティングにおいて、非常に役立つ指標の一つと言えるでしょう。

構文(syntax)

1<?php
2$time_in_micros = curl_getinfo($ch, CURLINFO_NAMELOOKUP_TIME_T);
3?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP cURL 名前解決時間計測

1<?php
2
3/**
4 * 指定されたURLに対してcURLリクエストを実行し、名前解決にかかった時間を計測・表示します。
5 * この関数はCURLINFO_NAMELOOKUP_TIME_T定数を使用して、高精度な時間計測を行います。
6 *
7 * @param string $url 計測対象のURL (例: 'http://example.com')
8 * @return void
9 */
10function measureCurlNameLookupTime(string $url): void
11{
12    // 1. cURLセッションを初期化します。
13    //    これはウェブサイトへのリクエストを行うための準備です。
14    $ch = curl_init();
15
16    // 2. cURLオプションを設定します。
17    //    - CURLOPT_URL: リクエストを送るURLを指定します。
18    curl_setopt($ch, CURLOPT_URL, $url);
19    //    - CURLOPT_RETURNTRANSFER: curl_exec()の戻り値を、取得したデータとするように設定します。
20    //      これがない場合、データは直接出力されます。
21    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
22    //    - CURLOPT_HEADER: 応答のヘッダー部分を取得しないように設定します。
23    curl_setopt($ch, CURLOPT_HEADER, false);
24
25    // 3. cURLリクエストを実行します。
26    //    この処理中に、指定されたURLのDNS名前解決(ドメイン名をIPアドレスに変換する処理)が行われます。
27    $response = curl_exec($ch);
28
29    // 4. cURL実行中にエラーが発生したかチェックします。
30    if (curl_errno($ch)) {
31        echo "cURLエラーが発生しました: " . curl_error($ch) . "\n";
32        curl_close($ch); // エラー時はセッションを閉じて終了
33        return;
34    }
35
36    // 5. CURLINFO_NAMELOOKUP_TIME_T定数を使用して、名前解決にかかった時間を取得します。
37    //    この定数は、PHP 8以降で推奨される、マイクロ秒単位で時間を返すオプションです。
38    //    戻り値は整数 (int) で、マイクロ秒単位の時間が入ります。
39    $nameLookupTimeMicroseconds = curl_getinfo($ch, CURLINFO_NAMELOOKUP_TIME_T);
40
41    // 6. cURLセッションを閉じます。
42    //    リソースを解放するために重要です。
43    curl_close($ch);
44
45    // 7. 結果を表示します。
46    echo "測定対象URL: " . $url . "\n";
47    if ($nameLookupTimeMicroseconds !== false) {
48        // マイクロ秒を秒に変換して、小数点以下も分かりやすく表示します。
49        $nameLookupTimeSeconds = $nameLookupTimeMicroseconds / 1_000_000;
50        echo "名前解決にかかった時間 (Name Lookup Time): "
51             . $nameLookupTimeMicroseconds . " マイクロ秒 (約 "
52             . sprintf('%.6f', $nameLookupTimeSeconds) . " 秒)\n";
53    } else {
54        echo "名前解決時間の取得に失敗しました。\n";
55    }
56}
57
58// サンプルとして、有名なウェブサイトの名前解決時間を計測してみましょう。
59// 実際のネットワーク状況やDNSキャッシュによって時間は変動します。
60measureCurlNameLookupTime('http://example.com');
61
62// 別のURLで試すこともできます。
63// measureCurlNameLookupTime('https://www.google.com');
64
65?>

このPHPサンプルコードは、指定されたURLに対するcURLリクエストにおいて、ウェブサイトのドメイン名からIPアドレスへの「名前解決」にかかる時間を高精度に計測し、表示するものです。名前解決とは、インターネット上でウェブサイトにアクセスするために必要な、ドメイン名のIPアドレス変換処理を指します。

コードではまずcurl_init()でcURLセッションを初期化し、curl_setopt()関数を使ってリクエスト先のURLなどの必要なオプションを設定します。次にcurl_exec()を実行することで実際のHTTPリクエストが行われ、その過程で名前解決処理が実行されます。

名前解決にかかった時間の取得には、CURLINFO_NAMELOOKUP_TIME_T定数を使用します。この定数は、curl_getinfo()関数に渡すことで、名前解決にかかった時間をマイクロ秒単位の整数値として返します。PHP 8で導入された_Tサフィックスを持つ時間関連の定数は、従来の小数点以下の秒数を返す定数よりも高精度な時間計測が可能で、細かなパフォーマンス分析に適しています。取得されたマイクロ秒単位の時間は、分かりやすくするために秒単位に変換して出力されます。

このmeasureCurlNameLookupTime関数は、計測対象のURLを$urlという文字列型の引数として受け取ります。関数の戻り値はvoidとなっており、これは関数が直接値を返却せず、処理結果を画面に出力することでその役割を終えることを示しています。最後にcurl_close()でcURLセッションを閉じ、使用したリソースを適切に解放します。

このサンプルコードは、PHP 8以降で利用可能なCURLINFO_NAMELOOKUP_TIME_T定数を用いて、ウェブサイトの名前解決にかかる時間を高精度に計測します。この定数は時間をマイクロ秒単位の整数で返しますので、秒単位で表示する場合は適切に変換する点に注意してください。curl_init()で開始したcURLセッションは、処理の完了後やエラー発生時に必ずcurl_close()で閉じ、リソースを適切に解放することが重要です。また、ネットワーク環境やDNSキャッシュの状況によって計測結果は大きく変動するため、測定値はあくまで目安として理解し、複数回試すことをお勧めします。実行中にエラーが発生する可能性もあるため、curl_errno()でエラーチェックを行う習慣をつけると安全なコードになります。

PHP curl名前解決時間取得

1<?php
2
3/**
4 * 指定されたURLへのCURLリクエストにおける名前解決時間を取得し表示します。
5 * CURLINFO_NAMELOOKUP_TIME_T を使用して、マイクロ秒単位で名前解決にかかった時間を測定します。
6 * この定数はPHP 7.0以降で利用可能であり、より高精度な時間情報を提供します。
7 *
8 * @param string $url 測定対象となるウェブサイトのURL。
9 * @return void
10 */
11function measureCurlNameLookupTime(string $url): void
12{
13    // CURLセッションを初期化します。
14    $ch = curl_init();
15
16    if ($ch === false) {
17        echo "エラー: CURLセッションの初期化に失敗しました。\n";
18        return;
19    }
20
21    // CURLオプションを設定します。
22    // CURLOPT_URL: リクエストのターゲットURLを設定します。
23    curl_setopt($ch, CURLOPT_URL, $url);
24    // CURLOPT_RETURNTRANSFER: curl_exec()が結果を文字列として返すように設定します。
25    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
26    // CURLOPT_NOBODY: レスポンスボディをダウンロードせず、ヘッダーのみを取得するように設定します。
27    // これにより、名前解決の時間測定に焦点を当てることができます。
28    curl_setopt($ch, CURLOPT_NOBODY, true);
29
30    // CURLリクエストを実行します。
31    $response = curl_exec($ch);
32
33    // リクエスト実行時のエラーをチェックします。
34    if ($response === false) {
35        echo "エラー: CURLリクエストの実行に失敗しました - " . curl_error($ch) . "\n";
36        curl_close($ch);
37        return;
38    }
39
40    // CURLINFO_NAMELOOKUP_TIME_T を使用して、名前解決にかかった時間をマイクロ秒単位で取得します。
41    // DNSルックアップなど、名前解決プロセスにかかる時間です。
42    $nameLookupTimeMicroseconds = curl_getinfo($ch, CURLINFO_NAMELOOKUP_TIME_T);
43
44    // CURLセッションを閉じ、リソースを解放します。
45    curl_close($ch);
46
47    if ($nameLookupTimeMicroseconds !== false) {
48        // 取得したマイクロ秒を秒に変換して表示します。
49        $nameLookupTimeSeconds = $nameLookupTimeMicroseconds / 1_000_000;
50        echo "URL: {$url}\n";
51        echo "名前解決にかかった時間 (CURLINFO_NAMELOOKUP_TIME_T): {$nameLookupTimeMicroseconds} マイクロ秒 ({$nameLookupTimeSeconds} 秒)\n";
52    } else {
53        echo "警告: 名前解決時間の取得に失敗しました。\n";
54    }
55}
56
57// サンプルとして、Googleのウェブサイトの名前解決時間を測定します。
58measureCurlNameLookupTime("https://www.google.com");

PHPのCURLINFO_NAMELOOKUP_TIME_Tは、CURL拡張機能の一部として提供される定数です。この定数は、ウェブサイトへアクセスする際に行われる「名前解決」という処理にかかった時間を測定するために使用されます。名前解決とは、指定されたドメイン名(例:www.example.com)を、インターネット上で実際にサーバーを特定するためのIPアドレスに変換するプロセス(主にDNSルックアップ)を指します。

CURLINFO_NAMELOOKUP_TIME_T定数自体に引数や戻り値はありませんが、curl_getinfo()関数の第二引数として渡すことで、CURLセッションが名前解決に費やした時間をマイクロ秒単位で取得できます。この定数はPHP 7.0以降で利用可能となり、より詳細で高精度な時間情報を提供します。

サンプルコードでは、measureCurlNameLookupTime関数が引数として受け取ったURLの名前解決時間を計測し、その結果を表示します。関数内でcurl_init()によりCURLセッションを初期化し、CURLOPT_URLで対象URLを設定します。名前解決時間の測定に特化するため、CURLOPT_NOBODYオプションでレスポンスボディのダウンロードを省略しています。curl_exec()でリクエストを実行後、curl_getinfo($ch, CURLINFO_NAMELOOKUP_TIME_T)を使用して名前解決にかかった時間をマイクロ秒で取得します。この値は秒に変換されて分かりやすく表示され、最後にcurl_close()でCURLリソースが適切に解放されます。これにより、ウェブアプリケーションのパフォーマンス分析や問題診断に役立てることが可能です。

このサンプルコードでは、CURLセッション開始後のcurl_close()によるリソース解放が非常に重要です。解放を忘れると、メモリリークの原因となる可能性があります。また、curl_init()curl_exec()curl_getinfo()の各関数の戻り値を必ず確認し、エラー発生時の適切な処理を実装してください。CURLINFO_NAMELOOKUP_TIME_Tは名前解決時間をマイクロ秒単位で提供するため、秒に変換する場合は1,000,000で割る計算が必要です。この定数はPHP 7.0以降で利用可能ですので、環境のPHPバージョンを確認しましょう。CURLOPT_NOBODYはレスポンスボディを無視してヘッダーのみを取得する設定であり、名前解決時間測定には有効ですが、目的によっては他のオプション設定が必要となります。

関連コンテンツ

関連IT用語

関連プログラミング言語