[PHP] DNS関連の関数まとめ

PHPDNS

仕事で様々なドメインのレコードをチェックする機会が増えてきました。

mxtoolboxのような様々なDNSレコードをチェックできるサイトもありますが毎回頼りきりなのもなんなので自分で作ってみることにしました。

その為に必要なPHPのDNSに関連する関数をまとめてみました。

checkdnsrr

説明

指定したホスト名(またはIPアドレス)にレコードが存在しているか否かを確認する。

パラメーター

host

ホスト名IPアドレスを指定できます。

type

レコードタイプを指定して確認することができます。

以下のいずれかのタイプを指定できます。

A, MX, NS, SOA, PTR, CNAME, AAAA, A6, SRV, NAPTR, TXT or ANY.

記入例

checkdnsrr('google.co.jp', "MX")

返り値

レコードが存在していればTrue、存在していない場合Falseを返します。

dns_get_record

説明

指定したホスト名に関連づけられた DNSレコードを取得します

パラメーター

hostname

ホスト名を指定します。

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

MXレコードを取得する場合には後述のgetmxrrを使用したほうが早いです。

こちらの環境ではDNS_ALLはエラーとなり使用できませんでした。

dns_get_record(): DNS Query failed

パラメーター無しでALLのような結果を得ることができました。

php.netにはDNS_ANYの利用について以下のような記載があります。

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


https://www.php.net/manual/ja/function.dns-get-record.php

よって、すべてのレコードを取得したい場合は、DNS_ALLまたはパラメータ無しがよいでしょう。

記入例

dns_get_record('google.co.jp', DNS_TXT) //タイプを指定 ※タイプは""で囲わない
dns_get_record('google.co.jp') //タイプ指定なし

返り値

連想配列を要素にもつ配列を返します。取得に失敗した場合にはfalseを返します。

配列に必ず含まれる要素

  • host
  • class
  • type
  • ttl

タイプにより連想配列に追加される要素

  • A
  • MX
  • CNAME
  • NS
  • PTR
  • TXT
  • HINFO
  • CAA
  • SOA
  • AAAA
  • A6(PHP >= 5.1.0)
  • SRV
  • NAPTR

例) タイプにDNS_TXT を指定した場合

array(1) { [0]=> array(6) { [“host”]=> string(12) “google.co.jp” [“class”]=> string(2) “IN” [“ttl”]=> int(300) [“type”]=> string(3) “TXT” [“txt”]=> string(11) “v=spf1 -all” [“entries”]=> array(1) { [0]=> string(11) “v=spf1 -all” } } }

getmxrr

説明

指定したホスト名に対応するMXレコードを取得する

パラメーター

hostname

ホスト名

mxhosts

上記ホスト名で見つかったMXレコードが配列として格納されます。

weight

このパラメーターを指定するとウエイトが配列として格納されます。

記入例

$res = getmxrr('google.co.jp' , $mxhosts, $weight);

返り値

上記のように記載した場合、$resには何かしらのレコードが見つかった場合はTRUE、見つからなかった場合にはFALSEを返します。

TRUEの場合、$mxhostsにはMXレコードが、$weightにはウエイトがそれぞれ配列で格納されます。

 

’google.co.jp’のMXレコードをチェックした場合、$mxhosts,$weightにはそれぞれ以下のように返り値が格納されます。

$mxhosts

array(5) { [0]=> string(23) “xxx.xxxxx.x.google.com” [1]=> string(23) “xxxx.xxxxx.x.google.com” [2]=> string(23) “xxxx.xxxxx.x.google.com” [3]=> string(23) “xxxx.xxxxx.x.google.com” [4]=> string(18) “xxxxx.x.google.com” }

$weight

array(5) { [0]=> int(30) [1]=> int(20) [2]=> int(50) [3]=> int(40) [4]=> int(10) }

getmxrr('google.co.jp' , $mxhosts, $weight);

for($i=0;$i<count($mxhosts);$i++){
    $mxs[$mxhosts[$i]] = $weight[$i];
}
print_r(mxs);

このように出力するとキレイかなと思います。

gethostbyname

説明

ドメイン名に紐づくIPアドレスを取得します。(正引き)

パラメーター

hostname

ホスト名

記入例

gethostbyname('google.co.jp')

返り値

指定したホスト名のIPv4アドレスを返します。

返り値の例

string(14) “xxx.xxx.xxx.xxx”

gethostbynamel

ドメイン名に紐づくIPアドレスのリストを取得します。(正引き)

パラメーター

hostname

ホスト名

記入例

gethostbynamel('google.co.jp')

返り値

指定したホスト名で検索して取得したIPv4アドレスのリストを配列で返します。

array(1) { [0]=> string(14) “xxx.xxx.xxx.xxx” }

gethostbyaddr

指定したIPアドレスに対応するドメイン名を取得します。(逆引き)

パラメーター

ipaddress

IPアドレス

記入例

gethostbyaddr(xxx.xxx.xxx.xxx)

返り値

指定したIPアドレスに対応するホストが存在する場合はホスト名を返します。存在しない場合はFALSEを返します。

PHPDNS