同样,在某些情况下,$host= gethostname(); $ip = gethostbyname($host);不会返回正确的值,因为它依赖于 DNS (内部配置或外部记录)和服务器的主机名设置来推断服务器的 IP 地址。这两个步骤都可能存在缺陷。例如,如果服务器的主机名被格式化为域名(即 HOSTNAME=yahoo.com) ,那么(至少在我的 php5.4/Centos6设置中) gethostbyname将直接跳到查找 Yahoo.com 的地址而不是本地服务器的地址。
此外,因为 gethostbyname回退到公共 DNS 记录一个测试服务器与未发布或不正确的公共 DNS 记录(例如,你访问服务器的 localhost或 IP 地址,或如果你重写公共 DNS 使用您的本地 hosts文件) ,然后你会得到没有 IP 地址(它只是返回主机名) ,甚至更糟糕的是,它会返回在公共 DNS 记录中指定的错误地址,如果存在一个或如果有一个通配符的域。
<?php
// create a new cURL resource
$ch = curl_init ();
// set URL and other appropriate options
curl_setopt ($ch, CURLOPT_URL, "http://ipecho.net/plain");
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
// grab URL and pass it to the browser
$ip = curl_exec ($ch);
echo "The public ip for this server is: $ip";
// close cURL resource, and free up system resources
curl_close ($ch);
?>