- 締切済み
[PHP] 任意のDNSでIPアドレスを取得
PHPスクリプトにてホスト名からIPアドレスを取得する際は getenv()関数を用いるのが一般的だと思うのですが、 名前解決を行うDNSを指定して取得する方法はありますでしょうか。 具体的には、コマンドプロンプトのnslookup時に、 対話形式で「server DNS」で指定できる様な事を PHPのスクリプトでも実現したいです。 PEARなどのライブラリを使用する方法でもOKですが、 導入予定のサーバーが共用レンタルサーバーの為、 サーバーにソフトをインストールする等の方法は導入が難しいです。 以上、宜しくお願い致します。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- NARH
- ベストアンサー率82% (88/107)
PEARパッケージの Net_DNS を使うと簡単に引けますね。 確か単体利用可能だと思ったので、手元の環境が PHP 5.3.3 で Net_DNS2 を見てみたのですが、幸運にも他のライブラリには依存していなく単体で動作可能のようです。 なので、 http://pear.php.net/manual/ja/package.networking.net-dns.net-dns-resolver.query.php より Net_DNS2-1.0.1.tgz を取得して展開。 Net_DNS2-1.0.1/ というフォルダができるので、 Net_DNS2 という名前に変更。 後はFTP等でサーバの任意のディレクトリにアップロードします。 後は利用するときに set_include_path() で設置したディレクトリを include_path に追加します。 サンプルです。 + public_html/ | + Net_DNS2/ + sample.php こんな構成にしてみます。 sample.php <?php // Net_DNS2 のディレクトリをinclude_path に含める $libDir = dirname(__FILE__) .DIRECTORY_SEPARATOR .'Net_DNS2'; set_include_path(get_include_path() .PATH_SEPARATOR .$libDir); // Net_DNS2 を呼ぶ require_once "Net/DNS2.php"; // google の公開DNSに問合せをする $r = new Net_DNS2_Resolver(array('nameservers' => array('8.8.8.8'))); try { // www.google.com の Aレコードを問合せ $result = $r->query('www.google.com', 'A'); foreach( $result->answer as $rec ) { echo $rec->name .PHP_EOL; } } catch(Exception $e) { echo "Faild to query: ", $e->getMessage(), PHP_EOL; } こんな感じです。 #この構成ですと、ブラウザからNet_DNS2 にアクセス出来ちゃうので、.htaccess 等で直接アクセスできないよう対策は必要ですね。 #設置場所はよく検討したほうが良いと思いますが、構成が解らないのでとりあえず動きそうなサンプルにしました。 PHP5 より古い場合は Net_DNS の利用になると思います。 ぱっと見た感じ、こちらも単体で動作可能のようです。 http://pear.php.net/package/Net_DNS/ 使い方もほぼ同じみたいですよ。 system 関数などでコマンドを実行するのもありですが、結果を自前でパースするのは面倒なので、こちらのほうが結果がオブジェクトになっているので使い勝手がいいかもしれませんね。
- bx2
- ベストアンサー率47% (97/206)
getenv()関数ってことは、自身のIPアドレス? NATを使っていてサーバがプライベートIPだから、DNSを使ってグローバルIPを知りたいとか。 「ホスト名からIPアドレスを取得する際」に一般的なのは、gethostbyname()関数ですが。 http://jp2.php.net/manual/ja/function.gethostbyname.php 任意のDNSサーバに対して問い合わせたいなら、Net_DNS_Resolver::query()でできます。 http://pear.php.net/manual/en/package.networking.net-dns.net-dns-resolver.query.php <?php require_once 'Net/DNS.php'; $resolver = new Net_DNS_Resolver(); $resolver->nameservers = array('ns.example.com'); $response = $resolver->query('example.com'); if ($response) { foreach ($response->answer as $rr) { $rr->display(); echo inet_ntop($rr->rdata) . "\n"; } } ?>
- yambejp
- ベストアンサー率51% (3827/7415)
たとえばsystem関数などでdigを実行するとか・・・