PHP如何获取系统的本地IP

时间:2010-07-10 12:28:14

标签: php ip-address

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

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

17 个答案:

答案 0 :(得分:97)

从CLI

PHP< 5.3.0

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

PHP> = 5.3.0

$localIP = getHostByName(getHostName());

答案 1 :(得分:55)

$_SERVER['SERVER_ADDR']

答案 2 :(得分:28)

这是一篇很老的帖子,但是可以这样做:

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

答案 3 :(得分:15)

取决于当地人的意思:

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

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

答案 4 :(得分:15)

可以像这样获取本地计算机的默认外部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的路线(例如您没有互联网连接),则可能无效。

答案 5 :(得分:10)

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

答案 6 :(得分:6)

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

答案 7 :(得分:4)

$localIP = gethostbyname(trim(exec("hostname")));

我试过在Windows PC上运行,并且认为将在Linux上运行。

答案 8 :(得分:1)

我为这个问题摆弄了一个服务器端的php(从Linux终端运行)

我爆炸'ifconfig'并将其修剪到IP地址。

这是:

$interface_to_detect = 'wlan0';
echo explode(' ',explode(':',explode('inet addr',explode($interface_to_detect,trim(`ifconfig`))[1])[1])[1])[0];

当然,将'wlan0'更改为您想要的网络设备。

我的输出是:

192.168.1.5

答案 9 :(得分:0)

如果您在OS X上的开发环境中,通过Wifi连接:

echo exec("/sbin/ifconfig en1 | grep 'inet ' | cut -d ' ' -f2");

答案 10 :(得分:0)

这非常简单,上面的答案使事情变得复杂。只需使用此方法即可获取本地和公共ip地址。

   <?php 
$publicIP = file_get_contents("http://ipecho.net/plain");
echo $publicIP;

$localIp = gethostbyname(gethostname());
echo $localIp;

?>

答案 11 :(得分:0)

这很容易。您可以通过以下简单代码获取主机名。

$ip = getHostByName(getHostName());

或者您也可以使用$_SERVER['HTTP_HOST']获取主机名。

答案 12 :(得分:0)

$_SERVER['SERVER_NAME']

对我有用。

答案 13 :(得分:0)

在Windows中

$exec = 'ipconfig | findstr /R /C:"IPv4.*"';
exec($exec, $output);
preg_match('/\d+\.\d+\.\d+\.\d+/', $output[0], $matches);
print_r($matches[0]);

答案 14 :(得分:0)

对于 Windows:

exec('arp -a',$sa);
$ipa = [];
foreach($sa as $s)
    if (strpos($s,'Interface:')===0)
        $ipa[] = explode(' ',$s)[1];

print_r($ipa);

$ipa 数组返回系统的所有本地 IP

答案 15 :(得分:-4)

$_SERVER['REMOTE_ADDR']
  • PHP_SELF返回当前脚本的文件名,其中包含相对于根的路径

  • SERVER_PROTOCOL返回页面请求协议的名称和修订

  • REQUEST_METHOD返回用于访问页面的请求方法

  • DOCUMENT_ROOT返回当前脚本执行的根目录

答案 16 :(得分:-4)

试试这个

$localIP = gethostbyname(trim('hostname'));