Net_DNS_Resolver::query() -- ネームサーバへの問い合わせを行い、結果を受け取る
説明
DNS 問い合わせパケットを作成し、それをシステムで設定されている
(例. /etc/resolv.conf)ネームサーバに送ります。
DNS サーバからの応答は、Net_DNS_Packet オブジェクトの形式で
戻されます。
リゾルバオブジェクトは、多くのプロパティを持っています。
その中には、システムのリゾルバ設定から自動的に読み込まれるものもあります。
Linux/UNIX 系のシステムでは、これらの設定は /etc/resolv.conf
や環境変数の値から取得されます。設定はオブジェクトのインスタンスが
生成される時点で行われ、その後適切なプロパティをセットすることで
上書き可能です。
ANSWER セクションがリソースレコードを含んでいる場合、この関数は
Net_DNS_Packet のみを返します。特に、もし DNS パケットヘッダの
ANCOUNT 変数が 0 だった場合、query() は 0 を返します
(注:0 です。FALSE ではありません)。ANSWER セクションのうち
リソースレコード以外の部分を取得したい場合は、
Net_DNS_Resolver::rawQuery()
を利用してください。これは、手動で再帰問い合わせをする際に便利です。
返ってきた RR データオブジェクトの詳細については、
Net_DNS_RR
を参照してください。
リゾルバ設定オブジェクトのプロパティ:
array $nameservers
問い合わせ対象となるネームサーバの IP アドレスの配列
int $port
問い合わせ対象となるネームサーバのポート。デフォルト値は 53。
array $domain
リゾルバクライアントホストが属するドメイン
array $searchlist
不完全なホスト名に対して付加されるドメイン名の配列
int $retry
回答が得られなかった問い合わせについて、問い合わせを再送信するまでの秒数
int $retrans
回答が得られなかった問い合わせについて、問い合わせを再送信する回数
int $recurse
ヘッダの RD (recursion desired) ビットの値を設定する。
もしこの値が 0 なら、サーバは再帰問い合わせを行わない。
int $usevc
TCP(仮想回線)を UDP の代わりに用いるかどうかを設定する。
もしこの値が 0 なら、TCP を要求されない限りは UDP を利用する。
TCP を要求されるのは、問い合わせや応答の内容が 512 バイトを超える
場合である。
int $debug
もしこの値が TRUE (ゼロ以外)なら、リゾルバが問い合わせを行う際に
デバッグ用コードが表示される。
環境変数:
RES_NAMESERVERS
問い合わせ対象ネームサーバの IP アドレスリスト。スペースで区切られた文字列。
RES_SEARCHLIST
不完全な検索要求に対して付加されるドメイン名。スペースで区切られた文字列。
LOCALDOMAIN
ドメイン名
RES_OPTIONS
スペースで区切られたオプションのリスト。書式は以下のとおり
オプション名:値
値が省略された場合、初期値として 1 (true) が設定される。
オプション名は、オブジェクトのプロパティに対応する。
例
例 54-1Net_DNS_Resolver::query() の使用 <?php
require_once 'Net/DNS.php';
$resolver = new Net_DNS_Resolver();
$response = $resolver->query('example.com');
if ($response) {
foreach ($response->answer as $rr) {
$rr->display();
}
}
?> |
出力結果:
example.com. 129808 IN A 192.0.34.166 |
|
次の例は、MX レコードを問い合わせる DNS クエリの例です。
ゾーン内のメールエクスチェンジャの IP アドレスが、回答の中の付加セクションに
含まれていることに注目しましょう。2番目のエクスチェンジャ
(これはゾーン内にはありません)の IP アドレスは含まれません。
このアドレスを受け取るには、得られたホスト名に対する A レコードを
改めて問い合わせる必要があります。
例 54-2Net_DNS_Resolver::query() を用いて MX レコードを検索する <?php
require_once 'Net/DNS.php';
$resolver = new Net_DNS_Resolver();
$response = $resolver->query('php.net', 'MX');
if ($response) {
foreach ($response->answer as $rr) {
$rr->display();
}
if (count($response->additional)) {
foreach ($response->additional as $rr) {
$rr->display();
}
}
}
?> |
出力結果:
php.net. 86121 IN MX 15 smtp.osuosl.org.
php.net. 86121 IN MX 5 osu1.php.net.
osu1.php.net. 86121 IN A 140.211.166.39 |
|
次はもう少し複雑な例で、デバッグ情報の表示を有効にしています。
usevc オプションを TRUE に設定していることに注意してください。
これにより、リゾルバに対して UDP ではなく TCP を利用することを強制しています。
このことは、デバッグ出力の中の send_tcp() の行で確認できます。
例 54-3ネームサーバとオプションを指定しての Net_DNS_Resolver::query() の使用 <?php
require_once 'Net/DNS.php';
$resolver = new Net_DNS_Resolver();
$resolver->debug = 1; // デバッグ用出力を有効にする
$resolver->usevc = 1; // UDP の代わりに TCP の使用を強制する
$resolver->nameservers = array(
'198.41.0.4', // ネームサーバに問い合わせる
'192.228.79.201' // IP アドレスを設定する
);
$response = $resolver->query('example.com');
if (! $response) {
echo "\n";
echo "ANCOUNT が 0 、つまり query() は「失敗しました」\n";
echo "このパケットを受け取るには、Net_DNS_Resolver::rawQuery() を参照してください\n";
}
?> |
出力結果:
;; query(example.com, A, IN)
;; send_tcp(198.41.0.4:53)
;; sending 29 bytes
;; received 517 bytes
;; HEADER SECTION
;; id = 58298
;; qr = 1 opcode = QUERY aa = 0 tc = 0 rd = 1
;; ra = 0 rcode = NOERROR
;; qdcount = 1 ancount = 0 nscount = 13 arcount = 15
;; QUESTION SECTION (1 record)
;;
;example.com. IN A
;; ANSWER SECTION (0 records)
;; AUTHORITY SECTION (13 records)
com. 172800 IN NS A.GTLD-SERVERS.NET.
com. 172800 IN NS G.GTLD-SERVERS.NET.
com. 172800 IN NS H.GTLD-SERVERS.NET.
com. 172800 IN NS C.GTLD-SERVERS.NET.
com. 172800 IN NS I.GTLD-SERVERS.NET.
com. 172800 IN NS B.GTLD-SERVERS.NET.
com. 172800 IN NS D.GTLD-SERVERS.NET.
com. 172800 IN NS L.GTLD-SERVERS.NET.
com. 172800 IN NS F.GTLD-SERVERS.NET.
com. 172800 IN NS J.GTLD-SERVERS.NET.
com. 172800 IN NS K.GTLD-SERVERS.NET.
com. 172800 IN NS E.GTLD-SERVERS.NET.
com. 172800 IN NS M.GTLD-SERVERS.NET.
;; ADDITIONAL SECTION (15 records)
A.GTLD-SERVERS.NET. 172800 IN AAAA 2001:503:a83e::2:30
A.GTLD-SERVERS.NET. 172800 IN A 192.5.6.30
G.GTLD-SERVERS.NET. 172800 IN A 192.42.93.30
H.GTLD-SERVERS.NET. 172800 IN A 192.54.112.30
C.GTLD-SERVERS.NET. 172800 IN A 192.26.92.30
I.GTLD-SERVERS.NET. 172800 IN A 192.43.172.30
B.GTLD-SERVERS.NET. 172800 IN AAAA 2001:503:231d::2:30
B.GTLD-SERVERS.NET. 172800 IN A 192.33.14.30
D.GTLD-SERVERS.NET. 172800 IN A 192.31.80.30
L.GTLD-SERVERS.NET. 172800 IN A 192.41.162.30
F.GTLD-SERVERS.NET. 172800 IN A 192.35.51.30
J.GTLD-SERVERS.NET. 172800 IN A 192.48.79.30
K.GTLD-SERVERS.NET. 172800 IN A 192.52.178.30
E.GTLD-SERVERS.NET. 172800 IN A 192.12.94.30
M.GTLD-SERVERS.NET. 172800 IN A 192.55.83.30
ANCOUNT が 0 、つまり query() は「失敗しました」
このパケットを受け取るには、Net_DNS_Resolver::rawQuery() を参照してください |
|
注意
この関数は、スタティックにコールする
ことはできません。