【PHP8.x】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)

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

引数(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レコードをキャッシュ利用し取得する

<?php

/**
 * DNS レコードを取得し、キャッシュの利用例を示す
 *
 * @param string $hostname ホスト名
 * @param int $type DNS レコードタイプ (例: DNS_A, DNS_MX)
 * @return array|false DNS レコードの配列、または失敗した場合 false
 */
function getDnsRecordsWithCache(string $hostname, int $type = DNS_A): array|false
{
    // キャッシュキーを生成 (単純な例)
    $cacheKey = 'dns_records_' . $hostname . '_' . $type;

    // APCu などのキャッシュ機構を利用 (ここでは、array で代替)
    static $cache = [];

    // キャッシュに存在するか確認
    if (isset($cache[$cacheKey])) {
        echo "キャッシュから取得: " . $cacheKey . "\n";
        return $cache[$cacheKey];
    }

    // DNS レコードを取得
    $records = dns_get_record($hostname, $type, $authoritative_name_servers, $additional_records);

    // 取得に失敗した場合
    if ($records === false) {
        return false;
    }

    // キャッシュに保存 (有効期限を設定することも可能)
    $cache[$cacheKey] = $records;

    echo "DNS サーバーから取得: " . $hostname . ", type: " . $type . "\n";

    return $records;
}

// 使用例
$hostname = 'example.com';

// A レコードを取得 (キャッシュを利用)
$aRecords = getDnsRecordsWithCache($hostname, DNS_A);

if ($aRecords !== false) {
    print_r($aRecords);
} else {
    echo "A レコードの取得に失敗しました。\n";
}

// MX レコードを取得 (キャッシュを利用)
$mxRecords = getDnsRecordsWithCache($hostname, DNS_MX);

if ($mxRecords !== false) {
    print_r($mxRecords);
} else {
    echo "MX レコードの取得に失敗しました。\n";
}

// もう一度 A レコードを取得 (キャッシュから取得される)
$aRecordsCached = getDnsRecordsWithCache($hostname, DNS_A);

if ($aRecordsCached !== false) {
    print_r($aRecordsCached);
} else {
    echo "A レコードの取得に失敗しました。\n";
}

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レコードを取得する

<?php

/**
 * 指定されたホストのDNSレコードを取得するサンプルコード
 *
 * DNSレコードが見つからない場合やエラーが発生した場合は、エラーメッセージを出力します。
 */
function getDnsRecords(string $hostname, int $type = DNS_ANY): void
{
    $authoritative_name_servers = [];
    $additional_records = [];

    $records = dns_get_record($hostname, $type, $authoritative_name_servers, $additional_records);

    if ($records === false) {
        echo "DNSレコードの取得に失敗しました。\n";
        return;
    }

    if (empty($records)) {
        echo "DNSレコードは見つかりませんでした。\n";
        return;
    }

    echo "DNSレコード:\n";
    print_r($records);

    echo "\n権威ネームサーバ:\n";
    print_r($authoritative_name_servers);

    echo "\n追加レコード:\n";
    print_r($additional_records);
}

// 使用例:example.com の A レコードを取得する
getDnsRecords("example.com", DNS_A);

// 使用例:存在しないホストの DNS レコードを取得する (エラーハンドリングの例)
getDnsRecords("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の設定ファイルを見直してください。

【PHP8.x】dns_get_record関数の使い方 | いっしー@Webエンジニア