PHP无法使用gethostbyname解析.local dns名称

时间:2013-11-13 12:36:51

标签: php dns

我对名称解析有疑问。我正在尝试连接到活动目录服务器。我可以从SRV recodrs成功获取ldap服务器地址。然后我尝试将DNS名称解析为IP地址,但它失败了:

<?php
echo 'example.com.:' . PHP_EOL;
echo gethostbyname('example.com.');
echo PHP_EOL;
echo 'dc1.veracomp.local.:' . PHP_EOL;
echo gethostbyname('dc1.my-company.local.');
echo PHP_EOL;
echo 'nslookup  dc1.my-company.local.:' . PHP_EOL;
echo `nslookup dc1.my-company.local.`;

example.com已正确解析,然后gethostbyname('dc1.my-company.local.')在返回dc1.my-company.local.而不是IP地址几秒钟后失败。仍然相同的PHP脚本可以调用nslookup来正确解析域名...:

example.com.:
93.184.216.119
dc1.my-company.local.:
dc1.my-company.local.
nslookup  dc1.my-company.local.:
Server:         xxx.xxx.254.117
Address:        xxx.xxx.254.117#53

Name:   dc1.my-company.local
Address: 192.168.12.21

这里有什么问题?

编辑: 我要求解析名称因为我遇到的真正问题是我可以连接到ldap://192.168.12.21ldap://dc1.my-company.pl,但我无法连接到ldap://dc1.my-company.local

不幸的是,_ldap._tcp.my-company.pl的SRV记录只返回本地地址。我不想硬编码.pl地址。我不明白为什么我必须手动解析本地地址,然后再将它们作为host选项传递给Zend_Ldap。

1 个答案:

答案 0 :(得分:0)

你应该避免在生产中使用它。 DNS解析可能需要0.5到4秒,在此期间您的脚本不会被执行。

我用这个;这将更快,更有效:

<?php
function getAddrByHost($hosts, $timeout = 3) {
  $returnString = '';
  foreach ($hosts as $host) {
    $query = `nslookup -timeout=$timeout -retry=1 $host`;
    if (preg_match('/\nAddress: (.*)\n/', $query, $matches))
      $returnString .= trim($matches[1]) . '<br>';
    $returnString .= $host . '<br>';
  }
  return $returnString;

}

$hostArray[] = 'www.example.com';
$hostArray[] = 'dc1.my-company.local';

$returnString = getAddrByHost($hostArray);
echo $returnString;
?>