dポイントプレゼントキャンペーン実施中!

PHPスクリプトにてホスト名からIPアドレスを取得する際は
getenv()関数を用いるのが一般的だと思うのですが、
名前解決を行うDNSを指定して取得する方法はありますでしょうか。

具体的には、コマンドプロンプトのnslookup時に、
対話形式で「server DNS」で指定できる様な事を
PHPのスクリプトでも実現したいです。

PEARなどのライブラリを使用する方法でもOKですが、
導入予定のサーバーが共用レンタルサーバーの為、
サーバーにソフトをインストールする等の方法は導入が難しいです。

以上、宜しくお願い致します。

A 回答 (3件)

PEARパッケージの Net_DNS を使うと簡単に引けますね。



確か単体利用可能だと思ったので、手元の環境が PHP 5.3.3 で Net_DNS2 を見てみたのですが、幸運にも他のライブラリには依存していなく単体で動作可能のようです。

なので、
http://pear.php.net/manual/ja/package.networking …
より 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 関数などでコマンドを実行するのもありですが、結果を自前でパースするのは面倒なので、こちらのほうが結果がオブジェクトになっているので使い勝手がいいかもしれませんね。
    • good
    • 0

getenv()関数ってことは、自身のIPアドレス?


NATを使っていてサーバがプライベートIPだから、DNSを使ってグローバルIPを知りたいとか。

「ホスト名からIPアドレスを取得する際」に一般的なのは、gethostbyname()関数ですが。
http://jp2.php.net/manual/ja/function.gethostbyn …

任意のDNSサーバに対して問い合わせたいなら、Net_DNS_Resolver::query()でできます。
http://pear.php.net/manual/en/package.networking …

<?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";
 }
}
?>
    • good
    • 0

たとえばsystem関数などでdigを実行するとか・・・

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!