我对名称解析有疑问。我正在尝试连接到活动目录服务器。我可以从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.21
或ldap://dc1.my-company.pl
,但我无法连接到ldap://dc1.my-company.local
。
不幸的是,_ldap._tcp.my-company.pl的SRV记录只返回本地地址。我不想硬编码.pl地址。我不明白为什么我必须手动解析本地地址,然后再将它们作为host
选项传递给Zend_Ldap。
答案 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;
?>