2

我在名称解析方面遇到了奇怪的问题。我正在尝试连接到活动目录服务器。我可以从 SRV 记录器成功获取 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 之前手动解析它们。

4

1 回答 1

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;
?>
于 2013-11-13T12:43:33.133 回答