Answers:
$localIP = getHostByName(php_uname('n'));
$localIP = getHostByName(getHostName());
$_SERVER['SERVER_ADDR']
getHostName
不会返回站点域名。
这是旧文章,但可以通过以下方式获得:
function getLocalIp()
{ return gethostbyname(trim(`hostname`)); }
例如:
die( getLocalIp() );
在另一个站点上找到它,请不要删除trim命令,否则您将获得计算机名称。
反引号(特殊引号):之所以起作用,是因为PHP会尝试将这些“特殊引号”(反引号)之间的内容作为shell命令运行,并返回结果输出。
gethostbyname(trim(`hostname`));
与执行非常相似(但效率更高):
$exec = exec("hostname"); //the "hostname" is a valid command in both windows and linux
$hostname = trim($exec); //remove any spaces before and after
$ip = gethostbyname($hostname); //resolves the hostname using local hosts resolver or DNS
gethostbyname
返回主机的回送IP(例如127.0.0.1)是可能且有效的。
试试看(如果您的服务器是Linux):
$command="/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'";
$localIP = exec ($command);
echo $localIP;
eth0
是适当的接口。
wlan0
而不是eth0
并替换'inet addr:'
为'inet adr:'
,这可能是由于系统上使用的语言环境(fr_FR)。除此之外,这个答案是我一直在寻找的解决方案。谢谢!
'inet adr:'
在我的终端(法语语言环境)中工作良好,但是在PHP脚本中'inet addr:'
是正确的值(我猜是英语语言环境)。
可以通过以下方式获取本地计算机的默认外部IP地址:
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_connect($sock, "8.8.8.8", 53);
socket_getsockname($sock, $name); // $name passed by reference
$localAddr = $name;
这个怎么运作:
由于这是UDP,因此socket_connect
不会在网络上发送出去。它仅将本地地址和端口分配给套接字。这使我们可以获取本地地址。
此解决方案无需任何网络流量,DNS或命令执行即可工作。
如果没有路由8.8.8.8
(例如,您没有互联网连接),它可能不起作用。
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
sockets
应该在PHP上安装并启用模块。
取决于本地的意思:
如果本地表示执行PHP代码的服务器/系统的地址,则仍有两种方法可以讨论。如果PHP通过Web服务器运行,则可以通过阅读获得服务器地址$_SERVER['SERVER_ADDR']
。如果PHP是通过命令行界面运行的,那么您可能必须执行shell执行ipconfig
(Windows)/ifconfig
(* nix)并grep输出地址。
如果在本地您是指网站访问者的远程地址,而不是他们的外部IP地址(因为您专门说的是192. *),那么您就不走运了。NAT路由的重点是隐藏该地址。您无法识别IP地址后面的单个计算机的本地地址,但是如果有多台计算机从同一IP访问,则有一些技巧(用户代理,可能是mac地址)可以帮助区分。
您可以在Linux主机上的CLI中以普通用户身份尝试使用此命令:
function get_local_ipv4() {
$out = split(PHP_EOL,shell_exec("/sbin/ifconfig"));
$local_addrs = array();
$ifname = 'unknown';
foreach($out as $str) {
$matches = array();
if(preg_match('/^([a-z0-9]+)(:\d{1,2})?(\s)+Link/',$str,$matches)) {
$ifname = $matches[1];
if(strlen($matches[2])>0) {
$ifname .= $matches[2];
}
} elseif(preg_match('/inet addr:((?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:[.](?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3})\s/',$str,$matches)) {
$local_addrs[$ifname] = $matches[1];
}
}
return $local_addrs;
}
$addrs = get_local_ipv4();
var_export($addrs);
输出:
array (
'eth0' => '192.168.1.1',
'eth0:0' => '192.168.2.1',
'lo' => '127.0.0.1',
'vboxnet0' => '192.168.56.1',
)
array('bond0'=>'10.66.42.83','bond1'=>'hosting Ip address','lo'=>'127.0.0.1', )
我懂了。我在php文件中添加了此代码,
split()
自PHP 5.3.0起,该函数已被弃用。因此建议explode()
改用
$localIP = gethostbyname(trim(exec("hostname")));
我在Windows pc上试过了,它工作了,还认为可以在Linux上工作。
这非常简单,上面的答案使事情变得复杂。只需使用此方法即可获取本地和公共IP地址。
<?php
$publicIP = file_get_contents("http://ipecho.net/plain");
echo $publicIP;
$localIp = gethostbyname(gethostname());
echo $localIp;
?>
这很容易。您可以通过以下简单代码获取主机名。
$ip = getHostByName(getHostName());
或者,您也可以使用$_SERVER['HTTP_HOST']
获取主机名。
试试这个
$localIP = gethostbyname(trim('hostname'));