Net_DNS_Resolver::query()

Net_DNS_Resolver::query() – ネームサーバへの問い合わせを行い、結果を受け取る

Synopsis

require_once('Net/DNS.php');

Net_DNS_Packet Net_DNS_Resolver::query ( string $hostname , string $type = 'A' , string $class = 'IN' )

Description

  • hostname - 調べたい名前(例. www.php.net)

  • type - 調べたいレコードタイプ

  • class - 調べたいゾーンクラス

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) が設定される。 オプション名は、オブジェクトのプロパティに対応する。

Example

Net_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 レコードを 改めて問い合わせる必要があります。

Net_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() の行で確認できます。

ネームサーバとオプションを指定しての 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() を参照してください

Note

This function can not be called statically.

DNS 問い合わせを操作するためのリゾルバの実装を提供する (Previous) ネームサーバへの問い合わせを行い、結果を受け取る (Next)
Last updated: Wed, 17 Sep 2014 — Download Documentation
Do you think that something on this page is wrong? Please file a bug report or add a note.
View this page in:

User Notes:

There are no user contributed notes for this page.