当前位置:  开发笔记 > 编程语言 > 正文

PHP如何获取系统的本地IP

如何解决《PHP如何获取系统的本地IP》经验,为你挑选了8个好方法。

我需要得到像192这样的计算机的本地IP.*....这可能用PHP吗?

我需要运行脚本的系统的IP地址,但我不需要外部IP,我需要他的本地网卡地址.



1> andras.tim..:

来自CLI

PHP <5.3.0

$localIP = getHostByName(php_uname('n'));

PHP> = 5.3.0

$localIP = getHostByName(getHostName());


在云托管环境中,这可能不会返回预期的结果.因为每个主机都有超过2个IP.
这个解决方案对我有用,可以避免调用shell,操作系统命令以及各种可以打开安全漏洞或以后引发奇怪问题的东西.

2> Sergey Eremi..:
$_SERVER['SERVER_ADDR']


澄清:计算机可以有多个IP地址.此变量仅限HTTP,包含运行虚拟主机的IP地址.鉴于这个问题有多模糊,很难说这是否是预期的答案.

3> Codebeat..:

这是一篇很老的帖子,但是得到它:

function getLocalIp()
{ return gethostbyname(trim(`hostname`)); }

例如:

die( getLocalIp() );

在另一个站点上找到它,不要删除trim命令,否则你将获得计算机名称.

BACKTICKS(特殊引号):它的工作原理是因为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


@paul:由于特殊的引号,当你使用普通引号时,由于某种原因它不起作用,当你删除trim命令时它甚至不起作用.我知道这听起来很奇怪.为此回答这个问题并不好.阅读答案.
不是最好的主意.`gethostbyname`可以并且对于主机返回环回IP(例如127.0.0.1)是有效的.
这对我帮助很大,我以为会有简单的PHP函数,比如**$ _ SERVER ['REMOTE_ADDR'];**这样做不起作用,但这个解决方案对我有用!!!

4> 小智..:

试试这个(如果你的服务器是Linux):

$command="/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'";
$localIP = exec ($command);
echo $localIP;


不是绝对正确的.无法保证`eth0`是合适的接口.
绝对正确.这就是答案(如果OP使用Linux).

5> Arnaud Le Bl..:

可以像下面这样获得本地计算机的默认外部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(例如,您没有互联网连接),它可能无法工作.


这个答案比其他人更好.任何对$ _SERVER数组的依赖都依赖于Apache下的这种运行.这个想法也适用于cron工作.如果服务器在登台或生产LAN上运行,我正在使用它来执行某些功能.完善!

6> Fosco..:

取决于当地人的意思:

如果本地是指执行PHP代码的服务器/系统的地址,那么仍有两种途径可供讨论.如果PHP正在通过Web服务器运行,那么您可以通过阅读获取服务器地址$_SERVER['SERVER_ADDR'].如果PHP正在通过命令行界面运行,那么您可能必须shell执行ipconfig(Windows)/ ifconfig(*nix)并grep out the address.

如果在本地你的意思是网站访问者的远程地址,而不是他们的外部IP地址(因为你特别说192.*),那么你运气不好.NAT路由的重点是隐藏该地址.您无法识别IP地址后面的个人计算机的本地地址,但是有一些技巧(用户代理,可能是MAC地址)可以帮助区分是否有多台计算机从同一IP访问.



7> ern0..:

hostname(1)可以告诉IP地址:hostname --ip-address或者正如man所说,最好使用它hostname --all-ip-addresses



8> ab1965..:

您可以在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',
)

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有