ホスト名に関連する DNS リソースレコードを取得する

# dns_get_record

(PHP 5, PHP 7)

dns_get_record — ホスト名に関連する DNS リソースレコードを取得する

### 説明

dns_get_record ( string `$hostname` [, int `$type` = DNS_ANY [, array `&$authns` [, array `&$addtl` [, bool `$raw` = `FALSE` ]]]] ) : array

指定した `hostname` に関連づけられた DNS リソースレコードを取得します。

### パラメータ

`hostname`

  `hostname` は、正しい DNS ホスト名、すなわち "www.example.com" のようなものでなければなりません。 in-addr.arpa 形式の表記を用いた逆引き検索は可能ですが、 たいていは gethostbyaddr() を用いるほうが適当です。

  > 注意:

  > DNS の標準規格により、メールアドレスは user.host 形式で渡されます （たとえば、hostmaster.example.com が hostmaster@example.com の代わりとなります）。 この値をしっかり確認し、mail() のような関数で 利用する前には必要なら変更を加えることを忘れないようにしてください。

`type`

  デフォルトでは、dns_get_record() は `hostname` に関連するすべてのリソースレコードを検索します。 これを制限するには、オプションの `type` パラメータを指定してください。 `type` は以下のうちのいずれかです。 `DNS_A`, `DNS_CNAME`, `DNS_HINFO`, `DNS_CAA`, `DNS_MX`, `DNS_NS`, `DNS_PTR`, `DNS_SOA`, `DNS_TXT`, `DNS_AAAA`, `DNS_SRV`, `DNS_NAPTR`, `DNS_A6`, `DNS_ALL` または `DNS_ANY`。

  > 注意:

  > プラットフォーム依存の libresolv のおかしな挙動のせいで、 `DNS_ANY` が常にすべてのレコードを返すとは 限りません。速度は遅くなりますが、`DNS_ALL` のほうがより確実にすべてのレコードを取得できます。

`authns`

  参照で渡し、 Authoritative Name Servers のリソースレコードが格納されます。

`addtl`

  参照で渡し、 Additional Records が格納されます。

`raw`

  raw モードでは、各タイプをループするのではなく、 リクエストしたタイプだけを問い合わせて追加情報に移ります。

### 返り値

この関数は、連想配列を要素にもつ配列を返します。 失敗した場合に `FALSE` を返します。 それぞれの連想配列には 少なくとも 以下のキーが含まれています:

基本 DNS 属性
属性 | 意味
--- | ---
host | これ以降の関連するデータが参照する DNS 名。
class | dns_get_record() は Internet クラスのレコードのみを返すので、このパラメータは常に IN を返します。
type | レコード型を表す文字列。type の値に応じて、 結果の配列には追加の属性が含まれます。以下の表を参照ください。
ttl | このレコードの"有効期限 (Time To Live)"。レコードの本来の ttl と一致するとは 限りません。むしろ、 ネームサーバーへのクエリにかかった時間をそこから引いたものに一致します。

'type' に応じて連想配列に追加される項目
レコード型 | 追加項目
--- | ---
A | ip: ドット区切り 10 進数形式の IPv4 アドレス。
MX | pri: メールエクスチェンジャの優先度。 数字が小さいほど優先度が高い。 target: メールエクスチェンジャの FQDN 。 dns_get_mx() も参照ください。
CNAME | target: レコードのエイリアスの対象となっている場所の FQDN 。
NS | target: このホスト名に対する権威をもっているネームサーバーの FQDN 。
PTR | target: レコードが指している、DNS 名前空間内の場所
TXT | txt: このレコードに関連付けられている任意の文字列。
HINFO | cpu: このレコードが参照しているマシンの CPU を識別する IANA 番号。 os: このレコードが参照しているマシン上の OS を識別する IANA 番号。 これらの値の意味については、IANA の » Operating System Names を参照ください。
CAA | flags: A one-byte bitfield; currently only bit 0 is defined, meaning 'critical'; other bits are reserved and should be ignored. tag: CAA タグの名前 (alphanumeric ASCII string). value: CAA タグの値 (binary string, may use subformats). 詳細は、» RFC 6844 を参照ください。
SOA | mname: リソースレコードの元となるマシンの FQDN 。 rname: このドメインの管理責任者の Email アドレス。 serial: ドメインのシリアル番号。 refresh: セカンダリネームサーバーがこのドメインのコピーを更新する際に参照するリフレッシュ間隔（秒単位）。 retry: リフレッシュが失敗した際に 2 度目のリフレッシュを試みるまでの間隔（秒単位） expire: セカンダリネームサーバーが、ゾーンデータの リフレッシュに失敗した場合にコピーのデータを破棄せず持ち続ける期間 （秒単位）。 minimum-ttl: クライアントが、 一度取得したデータを再リクエストすることなしに利用できる最小期間（秒単位）。 個々のリソースレコードによって上書きが可能。
AAAA | ipv6: IPv6 アドレス。
A6(PHP >= 5.1.0) | masklen: `chain` で指定された対象から引き継ぐビット長。 ipv6: `chain` とマージするためのこのレコードのアドレス。 chain: `ipv6` データとマージするための親レコード。
SRV | pri: (Priority) 値が小さいものが優先されます。 weight: 同じ優先順位の `targets` からランダムに選択する際の重み。 target および port: リクエストされたサービスが存在するホスト名とポート。 詳細は » RFC 2782 を参照ください。
NAPTR | order および pref: 上の `pri` および `weight` と同じ。 flags, services, regex, および replacement: » RFC 2915 で定義されるパラメータ。

### 変更履歴

バージョン | 説明
--- | ---
7.0.16, 7.1.2 | CAA レコード型のサポートが追加されました。
5.4.0 | `raw` パラメータが追加されました。
5.3.0 | この関数は、Windows プラットフォームでも動作するようになりました。
5.3.0 | これより前のバージョンでは、`authns` パラメータを指定したときには `addtl` パラメータも必須となっていました。

### 例

例1 dns_get_record() の使用

`<?php
$result = dns_get_record("php.net");
print_r($result);
?>`

上の例の出力は、 たとえば以下のようになります。

    Array
    (
        [0] => Array
            (
                [host] => php.net
                [type] => MX
                [pri] => 5
                [target] => pair2.php.net
                [class] => IN
                [ttl] => 6765
            )

        [1] => Array
            (
                [host] => php.net
                [type] => A
                [ip] => 64.246.30.37
                [class] => IN
                [ttl] => 8125
            )

    )

例2 dns_get_record() と DNS_ANY の使用

MX レコードが解決されれば、たいていはメールサーバーの IP アドレスを 取得したくなるものです。そのため、dns_get_record() は `addtl` に関連するレコードを含めて返します。 また、`authns` には 権威のあるネームサーバーのリストを含めて返します。

`<?php
/* php.net の "ANY" レコードを要求し、
それに付随する情報を格納した配列を
作成する。
$authns にはネームサーバーの一覧が、
また $addtl には追加レコードが
それぞれ格納される。 */
$result = dns_get_record("php.net", DNS_ANY, $authns, $addtl);
echo "Result = ";
print_r($result);
echo "Auth NS = ";
print_r($authns);
echo "Additional = ";
print_r($addtl);
?>`

上の例の出力は、 たとえば以下のようになります。

    Result = Array
    (
        [0] => Array
            (
                [host] => php.net
                [type] => MX
                [pri] => 5
                [target] => pair2.php.net
                [class] => IN
                [ttl] => 6765
            )

        [1] => Array
            (
                [host] => php.net
                [type] => A
                [ip] => 64.246.30.37
                [class] => IN
                [ttl] => 8125
            )

    )
    Auth NS = Array
    (
        [0] => Array
            (
                [host] => php.net
                [type] => NS
                [target] => remote1.easydns.com
                [class] => IN
                [ttl] => 10722
            )

        [1] => Array
            (
                [host] => php.net
                [type] => NS
                [target] => remote2.easydns.com
                [class] => IN
                [ttl] => 10722
            )

        [2] => Array
            (
                [host] => php.net
                [type] => NS
                [target] => ns1.easydns.com
                [class] => IN
                [ttl] => 10722
            )

        [3] => Array
            (
                [host] => php.net
                [type] => NS
                [target] => ns2.easydns.com
                [class] => IN
                [ttl] => 10722
            )

    )
    Additional = Array
    (
        [0] => Array
            (
                [host] => pair2.php.net
                [type] => A
                [ip] => 216.92.131.5
                [class] => IN
                [ttl] => 6766
            )

        [1] => Array
            (
                [host] => remote1.easydns.com
                [type] => A
                [ip] => 64.39.29.212
                [class] => IN
                [ttl] => 100384
            )

        [2] => Array
            (
                [host] => remote2.easydns.com
                [type] => A
                [ip] => 212.100.224.80
                [class] => IN
                [ttl] => 81241
            )

        [3] => Array
            (
                [host] => ns1.easydns.com
                [type] => A
                [ip] => 216.220.40.243
                [class] => IN
                [ttl] => 81241
            )

        [4] => Array
            (
                [host] => ns2.easydns.com
                [type] => A
                [ip] => 216.220.40.244
                [class] => IN
                [ttl] => 81241
            )

    )

### 注意

> 注意:

> PHP 5.3.0 より前のバージョンでは、OS によってはこの関数が実装されていませんでした。 そのような環境との互換生を保つには、 » PEAR の » Net_DNS クラスを使いましょう。

### 参考

- dns_get_mx() - getmxrr のエイリアス
- dns_check_record() - checkdnsrr のエイリアス