【问题标题】:Resolve hostname in PHP using different name server使用不同的名称服务器解析 PHP 中的主机名
【发布时间】:2012-07-18 19:43:03
【问题描述】:

如何使用 PHP 将主机名解析为 IP 地址, 但使用不同的名称服务器(例如OpenDNSGoogle Public DNS)。

dns_get_record()gethostbyname() 似乎无法使用与系统上当前设置的名称服务器不同的名称服务器(在 TCP/IP 设置中或 /etc/resolv.conf 中)。

我发现的唯一方法是使用 PEAR 类 Net/DNS,但它在 PHP 5.4 下给了我很多警告

【问题讨论】:

  • 是否可以通过 exec 运行 python 脚本并读取 shell 输出?我在这里看到在 urllib2 中解决了同样的问题:stackoverflow.com/questions/2236498/…
  • @DeaconDesperado:为什么要使用 python 脚本?如果你可以在 PHP 中使用 exec,为什么不直接调用 unix host 命令呢? exec('host google.com 8.8.8.8')?
  • @Rocket,只是建议我熟悉的内容,因此是评论而不是回答;)
  • 不错的选择,但我希望它快一点。 exec() 实际上分叉并使用管道来重定向标准输入和标准输出。这是非常昂贵的操作,在我的情况下会浪费 CPU 资源。

标签: php dns nslookup


【解决方案1】:

试试net_dns2(它也在 PEAR 中)。

【讨论】:

  • 看起来很有希望,很快就会给你反馈
  • require_once 'Net/DNS2.php'; $resolver = new Net_DNS2_Resolver( array('nameservers' => array('8.8.8.8')) ); $resp = $resolver->query("hooktube.com.", 'A'); print_r($resp); echo $resp->answer[0]->地址;
【解决方案2】:

如果您被允许从您的脚本运行 shell 脚本,您可以使用系统的nslookup 命令。

$host = 'stackoverflow.com';
$dns = '8.8.8.8';  // Google Public DNS

$ip = `nslookup $host $dns`; // the backticks execute the command in the shell

$ips = array();
if(preg_match_all('/Address: ((?:\d{1,3}\.){3}\d{1,3})/', $ip, $match) > 0){
    $ips = $match[1];
}

print_r($ips);

注意:如果$host$dns 来自用户输入,请使用escapeshellarg

【讨论】:

  • @jcarlosweb:对不起,我听不懂你在问什么。
  • 对不起。要知道我的网站的访问者是否使用 google public dns?
  • 没有办法检测到这一点。为什么你仍然需要这些信息?
  • 我收到了这些回复。请注意,对于雅虎来说,它说:“地址” C:\Users\User>nslookup slavi-2016-05-04.com 8.8.8.8 服务器:google-public-dns-a.google.com 地址:8.8.8.8 ** * google-public-dns-a.google.com 找不到 slavi-2016-05-04.com:域不存在 C:\Users\User>nslookup yahoo.com 8.8.8.8 服务器:google-public- dns-a.google.com 地址:8.8.8.8 非权威答案:名称:yahoo.com 地址:2001:4998:58:c02::a9 2001:4998:c:a06::2:4008 2001:4998: 44:204::a7 98.138.253.109 98.139.183.24 206.190.36.45
【解决方案3】:
<?
require_once 'Net/DNS2.php';

$resolver = new Net_DNS2_Resolver( array('nameservers' => array('208.67.222.123')) );

$resp = $resolver->query("hooktube.com.", 'A');

print_r($resp);

echo $resp->answer[0]->address;

【讨论】:

  • 如果我的网站访问者的 IP 是可能的。访问者是否使用 DNS 访问 Google?
  • 是的,但您不需要为此使用 dns2。 apache /php 为此提供了 $_SERVER[REMOTE_ADDR] 。如果不确定 - 执行 print_r($_SERVER) 或询问相关问题。
  • 对不起。要知道我的网站的访问者是否使用 google public dns?
猜你喜欢
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
  • 2020-11-23
  • 2012-04-16
  • 2019-06-06
  • 2019-12-18
  • 2022-01-17
  • 1970-01-01
相关资源
最近更新 更多