我需要获取计算机的本地IP地址,例如192.*.... 是否可以使用PHP实现?
我需要获得运行该脚本的系统的IP地址,但我不需要外部IP地址,我需要它的本地网络卡地址。
我需要获取计算机的本地IP地址,例如192.*.... 是否可以使用PHP实现?
我需要获得运行该脚本的系统的IP地址,但我不需要外部IP地址,我需要它的本地网络卡地址。
$localIP = getHostByName(php_uname('n'));
$localIP = getHostByName(getHostName());
$_SERVER['SERVER_ADDR']
getHostName
不会返回站点的域名。 - Yep_It's_Me这是一篇旧帖子,但可以使用以下方法获取:
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)是可能且有效的。 - nobody获取本地机器的外部IP地址的可靠方法是查询路由表,尽管我们在PHP中没有直接的方法来做到这一点。
但是我们可以通过将UDP套接字绑定到公共地址并获取其地址,让系统为我们执行此操作:
$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
// This is the local machine's external IP address
$localAddr = $name;
socket_connect
不会引起网络流量,因为它是一个UDP套接字。
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
- FatherShawnsokcets
模块。 - Fabio Montefuscolo如果您的服务器是Linux,请尝试以下操作:
$command="/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'";
$localIP = exec ($command);
echo $localIP;
eth0
是合适的接口。 - nobodywlan0
而不是eth0
,并将'inet addr:'
替换为'inet adr:'
,可能是由于我系统上使用的语言环境(fr_FR)。除此之外,这个答案就是我正在寻找的解决方案。谢谢! - sylbru'inet adr:'
是有效的,但在 PHP 脚本中,'inet addr:'
才是正确的值(英语环境,我猜)。 - sylbru这要看你所谓的“本地”是指什么:
如果你指的是执行PHP代码的服务器/系统的地址,那么仍有两种途径可以讨论。如果PHP通过Web服务器运行,则可以通过读取$_SERVER['SERVER_ADDR']
来获得服务器地址。如果PHP通过命令行界面运行,则可能需要执行ipconfig
(Windows)/ifconfig
(*nix)并使用grep查找地址。
如果你指的是网站访问者的远程地址,但不是他们的外部IP地址(因为你特别说了192.*),那么你就没办法了。NAT路由的整个目的就是隐藏该地址。你无法识别IP地址后面的单个计算机的本地地址,但是有一些技巧(用户代理,可能是MAC地址)可以帮助区分是否有多台计算机从同一个IP地址访问。
这很简单,其他回答把事情复杂化了。你只需要使用这种方法就可以获取本地和公共IP地址。
<?php
$publicIP = file_get_contents("http://ipecho.net/plain");
echo $publicIP;
$localIp = gethostbyname(gethostname());
echo $localIp;
?>
hostname(1) 可以告诉您 IP 地址:hostname --ip-address
,或者根据 man 手册上的说法,最好使用 hostname --all-ip-addresses
$localIP = getHostByName(getHostName());
// Displaying the address
echo $localIP;
shell_exec("ip route get 1.2.3.4 | awk '{print $7}'")
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'=>'主机IP地址','lo'=>'127.0.0.1', )
我已经得到了这个代码。我将其添加到了PHP文件中。 - Straw Hatsplit()
函数自PHP 5.3.0版本起已被弃用,建议使用explode()
代替。 - Thanu