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

【PHP8.x】dns_get_record()関数の使い方

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

作成日: 更新日:

基本的な使い方

dns_get_record関数は、指定されたホスト名に関連付けられたDNS(Domain Name System)リソースレコードを取得する関数です。この関数は、インターネット上のドメイン名と関連付けられた情報、例えばWebサイトのIPアドレス(Aレコード)やメールサーバー(MXレコード)などを調べる際に利用されます。

この関数は、必須の引数として、調べたいホスト名(例: example.com)を文字列で指定します。オプションの2番目の引数typeを使うと、取得したいレコードの種類を限定できます。typeを省略した場合、利用可能なすべての種類のレコードが取得されます。

処理が成功すると、dns_get_record関数は、取得されたDNSレコードの詳細情報を含む連想配列の配列を返します。各レコードの配列には、種類、有効期間(TTL)、実際のデータ(IPアドレスやサーバー名など)といった情報が含まれています。レコードの取得に失敗した場合はfalseを返します。この機能は、外部のDNSサーバーにネットワーク経由で問い合わせを行うため、インターネット接続が必須です。システムエンジニアのドメイン情報検証やネットワークアプリケーション開発に役立ちます。

構文(syntax)

1<?php
2$records = dns_get_record("example.com", DNS_ANY);
3if ($records !== false) {
4    print_r($records);
5} else {
6    echo "DNSレコードの取得に失敗しました。";
7}
8?>

引数(parameters)

string $hostname, int $type = DNS_ANY, ?array &$authoritative_name_servers = null, ?array &$additional_records = null, bool $raw = false

  • string $hostname: 取得したいDNSレコードのホスト名またはIPアドレスを指定する文字列
  • int $type = DNS_ANY: 取得したいDNSレコードの種類を指定する整数。デフォルトはDNS_ANY(すべてのレコードタイプ)。
  • ?array &$authoritative_name_servers = null: 権威DNSサーバーの情報を格納する配列。参照渡し。
  • ?array &$additional_records = null: 追加のDNSレコード情報を格納する配列。参照渡し。
  • bool $raw = false: 生のDNS応答を返すかどうかを指定するブール値。trueの場合、生のバイナリデータが返されます。

戻り値(return)

array|false

指定されたドメイン名に関連するDNSレコードの配列を返します。レコードが見つからない、またはエラーが発生した場合はfalseを返します。

サンプルコード

PHPでDNSレコードをキャッシュ利用し取得する

1<?php
2
3/**
4 * DNS レコードを取得し、キャッシュの利用例を示す
5 *
6 * @param string $hostname ホスト名
7 * @param int $type DNS レコードタイプ (例: DNS_A, DNS_MX)
8 * @return array|false DNS レコードの配列、または失敗した場合 false
9 */
10function getDnsRecordsWithCache(string $hostname, int $type = DNS_A): array|false
11{
12    // キャッシュキーを生成 (単純な例)
13    $cacheKey = 'dns_records_' . $hostname . '_' . $type;
14
15    // APCu などのキャッシュ機構を利用 (ここでは、array で代替)
16    static $cache = [];
17
18    // キャッシュに存在するか確認
19    if (isset($cache[$cacheKey])) {
20        echo "キャッシュから取得: " . $cacheKey . "\n";
21        return $cache[$cacheKey];
22    }
23
24    // DNS レコードを取得
25    $records = dns_get_record($hostname, $type, $authoritative_name_servers, $additional_records);
26
27    // 取得に失敗した場合
28    if ($records === false) {
29        return false;
30    }
31
32    // キャッシュに保存 (有効期限を設定することも可能)
33    $cache[$cacheKey] = $records;
34
35    echo "DNS サーバーから取得: " . $hostname . ", type: " . $type . "\n";
36
37    return $records;
38}
39
40// 使用例
41$hostname = 'example.com';
42
43// A レコードを取得 (キャッシュを利用)
44$aRecords = getDnsRecordsWithCache($hostname, DNS_A);
45
46if ($aRecords !== false) {
47    print_r($aRecords);
48} else {
49    echo "A レコードの取得に失敗しました。\n";
50}
51
52// MX レコードを取得 (キャッシュを利用)
53$mxRecords = getDnsRecordsWithCache($hostname, DNS_MX);
54
55if ($mxRecords !== false) {
56    print_r($mxRecords);
57} else {
58    echo "MX レコードの取得に失敗しました。\n";
59}
60
61// もう一度 A レコードを取得 (キャッシュから取得される)
62$aRecordsCached = getDnsRecordsWithCache($hostname, DNS_A);
63
64if ($aRecordsCached !== false) {
65    print_r($aRecordsCached);
66} else {
67    echo "A レコードの取得に失敗しました。\n";
68}

dns_get_record関数は、指定されたホスト名のDNSレコードを取得するPHPの関数です。この関数は、DNS情報を利用するシステムにおいて、名前解決やメールサーバーの特定などに役立ちます。

サンプルコードでは、getDnsRecordsWithCacheという関数を作成し、dns_get_record関数の結果をキャッシュすることで、DNSサーバーへの問い合わせ回数を減らし、パフォーマンスを向上させる例を示しています。

getDnsRecordsWithCache関数は、ホスト名とDNSレコードタイプ(例:DNS_AはAレコード、DNS_MXはMXレコード)を引数として受け取ります。最初に、キャッシュキーを生成し、キャッシュにレコードが存在するか確認します。キャッシュに存在する場合は、キャッシュからレコードを返します。存在しない場合は、dns_get_record関数を使ってDNSサーバーからレコードを取得し、取得したレコードをキャッシュに保存します。

dns_get_record関数は、ホスト名($hostname)とレコードタイプ($type)を必須の引数として受け取り、オプションで権威ネームサーバーの情報($authoritative_name_servers)や追加レコードの情報($additional_records)を受け取るための引数、そしてrawフォーマットで結果を返すかどうかを指定する引数($raw)を受け取ります。成功した場合は、DNSレコードの配列を返し、失敗した場合はfalseを返します。

サンプルコードでは、example.comのAレコードとMXレコードをそれぞれ取得し、その後もう一度Aレコードを取得しています。2回目のAレコード取得時には、キャッシュが利用されるため、DNSサーバーへの問い合わせは行われず、キャッシュから即座に結果が返されます。このように、キャッシュを利用することで、DNS情報を効率的に利用できます。

dns_get_record関数は、指定されたホスト名のDNSレコードを取得する関数です。サンプルコードでは、キャッシュ機構を利用してDNSルックアップのパフォーマンスを向上させています。

注意点として、DNS情報は変更される可能性があるため、キャッシュの有効期限を適切に設定する必要があります。APCuなどの永続的なキャッシュ機構を利用することで、より効果的なキャッシュが可能です。

引数$typeには、取得したいレコードの種類(DNS_A, DNS_MXなど)を指定します。DNS_ANYを指定すると全てのレコードを取得できますが、処理に時間がかかる場合があります。

戻り値がfalseの場合、DNSレコードの取得に失敗したことを意味します。エラーハンドリングを適切に行い、プログラムが予期せぬ動作をしないように注意してください。

PHPでDNSレコードを取得する

1<?php
2
3/**
4 * 指定されたホストのDNSレコードを取得するサンプルコード
5 *
6 * DNSレコードが見つからない場合やエラーが発生した場合は、エラーメッセージを出力します。
7 */
8function getDnsRecords(string $hostname, int $type = DNS_ANY): void
9{
10    $authoritative_name_servers = [];
11    $additional_records = [];
12
13    $records = dns_get_record($hostname, $type, $authoritative_name_servers, $additional_records);
14
15    if ($records === false) {
16        echo "DNSレコードの取得に失敗しました。\n";
17        return;
18    }
19
20    if (empty($records)) {
21        echo "DNSレコードは見つかりませんでした。\n";
22        return;
23    }
24
25    echo "DNSレコード:\n";
26    print_r($records);
27
28    echo "\n権威ネームサーバ:\n";
29    print_r($authoritative_name_servers);
30
31    echo "\n追加レコード:\n";
32    print_r($additional_records);
33}
34
35// 使用例:example.com の A レコードを取得する
36getDnsRecords("example.com", DNS_A);
37
38// 使用例:存在しないホストの DNS レコードを取得する (エラーハンドリングの例)
39getDnsRecords("nonexistent.example.com");

このサンプルコードは、PHPのdns_get_record関数を使用して、指定されたホストのDNSレコードを取得する方法を示しています。dns_get_record関数は、第一引数にホスト名(string $hostname)を、第二引数に取得したいレコードのタイプ(int $type、デフォルトはDNS_ANYで全てのタイプ)を指定します。第三引数 $authoritative_name_serversと第四引数 $additional_records はそれぞれ権威ネームサーバと追加レコードを格納する配列への参照渡しです。第五引数 $raw は bool 値で、デフォルトは false です。

関数は、成功した場合にDNSレコードの配列を、失敗した場合にfalseを返します。サンプルコードでは、まずdns_get_record関数を呼び出し、返り値がfalseである場合はエラーメッセージを出力します。次に、取得されたレコードが空である場合(レコードが見つからなかった場合)もメッセージを出力します。

正常にレコードが取得できた場合は、取得したDNSレコード、権威ネームサーバ、および追加レコードの内容をprint_r関数で出力します。print_r関数は、配列の内容を人間が読みやすい形式で表示するために使用されます。

例として、example.comのAレコードを取得するケースと、存在しないホストを指定してエラーハンドリングを確認するケースが示されています。このコードを実行することで、DNSレコードの取得とエラー処理の方法を学ぶことができます。

dns_get_record関数を使う際の注意点です。まず、関数がfalseを返す場合、DNS解決に失敗している可能性があります。ネットワーク接続やDNSサーバーの設定を確認してください。ホスト名が存在しない場合もfalseまたは空の配列が返ります。

引数$authoritative_name_servers$additional_recordsは参照渡しなので、関数内で値が更新されます。これらの引数を省略しない場合、必ず変数として初期化してから渡してください。

DNS_ANYを指定すると全てのレコードタイプを取得できますが、結果の配列が大きくなる可能性があります。必要なレコードタイプを絞ることで、処理を効率化できます。dns_get_recordが期待通りに動作しない場合、PHPがDNS解決を正しく設定できているか確認が必要です。OSの設定やPHPの設定ファイルを見直してください。

PHP dns_get_record でタイムアウトを体験する

1<?php
2
3/**
4 * このスクリプトは、PHPのdns_get_record関数を使用して指定されたホスト名のDNSレコードを取得します。
5 * dns_get_record関数自体には直接的なタイムアウト引数がありませんが、
6 * PHPスクリプト全体の実行時間制限 (set_time_limit) を設定することで、
7 * DNS解決に時間がかかりすぎる場合にスクリプトがタイムアウトする動作を示すことができます。
8 *
9 * キーワード: php dns_get_record timeout
10 */
11
12// DNS問い合わせを行うホスト名
13// 存在しないドメインや、応答が遅いDNSサーバーのドメインを設定することで、
14// タイムアウト挙動をより明確に確認できる場合があります。
15$hostname = 'example.com'; 
16
17// スクリプトの実行時間制限を短めに設定(例: 5秒)。
18// この時間内にDNS問い合わせを含むスクリプトの処理が完了しない場合、
19// PHPはFatal Error(Maximum execution time exceeded)を発生させて終了します。
20// これにより、間接的にDNS解決のタイムアウトを「体験」できます。
21set_time_limit(5); 
22
23echo "--- DNSレコード取得開始 ---\n";
24echo "対象ホスト名: {$hostname}\n";
25echo "スクリプト実行時間制限: " . ini_get('max_execution_time') . "秒 (現在の設定)\n";
26echo "※ set_time_limit(5) により、このスクリプトは最大5秒で終了します。\n\n";
27
28// DNS解決処理の開始時刻を記録
29$startTime = microtime(true);
30
31// dns_get_record関数を呼び出して、指定されたホスト名のAレコード(IPv4アドレス)を取得します。
32// 第2引数 DNS_A はレコードタイプを指定します。
33// その他の引数(権威DNSサーバー、追加レコード、生データ取得)はデフォルト値を使用します。
34$records = dns_get_record($hostname, DNS_A);
35
36// DNS解決処理の終了時刻を記録
37$endTime = microtime(true);
38
39// 処理にかかった時間を計算(小数点以下3桁に丸める)
40$executionTime = round($endTime - $startTime, 3);
41
42if ($records === false) {
43    // dns_get_recordがfalseを返した場合、DNS解決に失敗したことを意味します。
44    // これには、ドメインが存在しない、DNSサーバーに到達できない、
45    // あるいは設定されたスクリプトのタイムアウト値を超過したなどが考えられます。
46    echo "エラー: ホスト名 '{$hostname}' のDNSレコード取得に失敗しました。\n";
47    echo "考えられる原因: ドメインが存在しない、ネットワークの問題、またはDNS解決がスクリプトのタイムアウト(" . ini_get('max_execution_time') . "秒)を超過しました。\n";
48} elseif (empty($records)) {
49    // レコードが空の場合、ホスト名は存在するが、指定されたタイプ(DNS_A)のレコードが見つからなかったことを意味します。
50    echo "注意: ホスト名 '{$hostname}' に対して、指定されたタイプ (Aレコード) のDNSレコードが見つかりませんでした。\n";
51} else {
52    // 成功した場合、取得したDNSレコードを表示します。
53    echo "成功: ホスト名 '{$hostname}' のDNSレコードが見つかりました。\n";
54    foreach ($records as $record) {
55        // Aレコードの主要な情報を表示
56        if (isset($record['type']) && $record['type'] === 'A' && isset($record['ip'])) {
57            echo "  タイプ: A, IPアドレス: {$record['ip']}, TTL (秒): {$record['ttl']}\n";
58        }
59        // 他のレコードタイプも取得している場合は、ここで適宜表示を追加できます。
60    }
61}
62
63echo "\nDNS解決試行にかかった時間: {$executionTime}秒\n";
64echo "--- DNSレコード取得終了 ---\n";
65
66// もしスクリプトが「Maximum execution time exceeded」エラーで終了した場合、
67// この最後の行は表示されません。それがタイムアウトの証拠となります。
68
69?>

このサンプルコードは、PHPのdns_get_record関数を使って、指定したホスト名(例: example.com)のDNSレコード情報を取得する方法を示しています。dns_get_record関数は、第一引数に取得したいホスト名を、第二引数にレコードの種類(例: DNS_AでIPv4アドレス)を指定して呼び出します。成功すると、取得したDNSレコードの詳細が格納された配列を返し、DNS解決に失敗した場合はfalseを返します。また、参照渡しの引数で権威DNSサーバーや追加レコードの情報を取得することも可能です。

dns_get_record関数には直接的なタイムアウト設定の引数がありませんが、このスクリプトではset_time_limit(5)を使用して、PHPスクリプト全体の実行時間制限を5秒に設定しています。これにより、DNS解決処理が5秒を超過した場合、スクリプトは「Maximum execution time exceeded」というエラーで強制終了し、間接的にDNS解決におけるタイムアウトの挙動を体験できます。

コードは、処理開始時刻を記録し、dns_get_recordを実行後、終了時刻との差からかかった時間を表示します。結果がfalseならDNS解決の失敗、空の配列なら指定したタイプのレコードが存在しないことを意味します。成功した場合は、取得されたAレコードのIPアドレスとTTL(キャッシュ有効期限)が表示されます。もしスクリプトがタイムアウトした場合、最後の完了メッセージは表示されません。

このサンプルコードは、dns_get_record関数に直接タイムアウトを設定できないため、set_time_limit関数でPHPスクリプト全体の実行時間制限を設けることで、DNS解決の遅延によるタイムアウト挙動を体験できる点に注意が必要です。set_time_limitを超過するとスクリプトは強制終了し、「Maximum execution time exceeded」エラーが発生します。また、dns_get_recordの戻り値は、失敗時にfalse、指定タイプのレコードが見つからない場合は空の配列となるため、必ずこれらの結果を適切に処理するエラーハンドリングを実装することが重要です。DNS解決はネットワークに依存し不安定な場合があるため、本番環境ではエラー処理やリトライ機構の検討をお勧めします。共有サーバー環境ではset_time_limitが利用制限される場合もあります。

関連コンテンツ

関連プログラミング言語