PHP如何获取系统的本地IP

PHP如何获取系统的本地IP,php,ip-address,Php,Ip Address,我需要获得计算机的本地IP,比如192.*。。。。 这在PHP中是可能的吗 我需要运行脚本的系统的IP地址,但我不需要外部IP,我需要他的本地网卡地址。取决于您所说的本地: $_SERVER['SERVER_ADDR'] 如果local是指执行PHP代码的服务器/系统的地址,那么还有两种方法可以讨论。如果PHP是通过web服务器运行的,那么您可以通过读取$\u server['server\u ADDR']来获取服务器地址。如果PHP是通过命令行界面运行的,那么您可能需要shell执行ipco

我需要获得计算机的本地IP,比如192.*。。。。 这在PHP中是可能的吗


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

取决于您所说的本地:

$_SERVER['SERVER_ADDR']
如果local是指执行PHP代码的服务器/系统的地址,那么还有两种方法可以讨论。如果PHP是通过web服务器运行的,那么您可以通过读取
$\u server['server\u ADDR']
来获取服务器地址。如果PHP是通过命令行界面运行的,那么您可能需要shell执行
ipconfig
(Windows)/
ifconfig
(*nix)并grep出地址

如果“本地”指的是网站访问者的远程地址,而不是他们的外部IP地址(因为你特别提到192.*),那么你就不走运了。NAT路由的全部要点就是隐藏该地址。您无法识别IP地址后面的单个计算机的本地地址,但有一些技巧(用户代理,可能是mac地址)可以帮助区分是否有多台计算机从同一IP访问。

试试这个

$localIP = gethostbyname(trim('hostname'));
尝试以下操作(如果您的服务器是Linux):


这是一篇旧文章,但请使用以下内容:

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

die( getLocalIp() );
在另一个站点上找到它,请不要删除trim命令,否则将获得计算机名称

反勾号(特殊引号): 它之所以有效,是因为PHP将尝试以shell命令的形式运行那些“特殊引号”(backticks)之间的任何内容,并返回结果输出

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
  • PHP_SELF
    返回当前脚本的文件名以及相对于根的路径

  • SERVER\u协议
    返回请求的页面协议的名称和版本

  • REQUEST\u METHOD
    返回用于访问页面的请求方法

  • DOCUMENT\u ROOT
    返回当前脚本正在其下执行的根目录


主机名(1)可以告诉IP地址:
主机名--IP地址
,或者如man所说,最好使用
主机名--all IP地址
,您可以作为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',
)
从CLI PHP<5.3.0
$localIP=getHostByName(php_uname('n')

PHP>=5.3.0
$localIP=getHostByName(getHostName())

我在服务器端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

我在Windows pc上试过,它已经工作了,而且我认为在Linux上也可以工作。

获取本地机器外部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\u connect
不会导致任何网络流量,因为它是UDP套接字。

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

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

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

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

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

?>

这很简单。您可以通过这个简单的代码获得主机名

$ip = getHostByName(getHostName());
或者您也可以使用
$\u SERVER['HTTP\u HOST']
获取主机名

$\u服务器['SERVER\u NAME']
它对我很有用。

在windows中

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

@保罗:因为特殊的引号,当你使用普通引号时,由于某种原因它不起作用,当你删除trim命令时,它甚至不起作用。我知道这听起来很奇怪。对这个问题的答案投反对票是不好的。阅读答案。反勾号(`)在PHP中称为执行运算符。在第一个代码块中执行的操作与exec命令几乎相同。看来这不是最好的主意。
gethostbyname
为主机返回一个环回IP(例如127.0.0.1)是可能的,也是有效的。这对我帮助很大,我认为会有简单的PHP函数,比如$_SERVER['REMOTE_ADDR';这不起作用,但这个解决方案对我有效!!!说明:一台计算机可以有多个IP地址。此变量仅为HTTP,包含虚拟主机运行的IP地址。考虑到这个问题的模糊性,很难说这是否是预期的答案。我认为这是正确的,因为你总是需要一个附加的ip,一个是回应你的。如果没有,您必须使用@andras.tim的asnwers,因为它告诉您系统的主ip。这正是我想要的,因为我的服务器在负载平衡器后面,所以
getHostName
不会返回站点域名。如果您在docker容器中运行,这是不起作用的。最后但并非最不重要的一点,ipconfig/ifconfig很可能返回多个IP地址:因为计算机通常没有一个地址。很好的回答。是的,NAT的全部要点是隐藏本地IP。现在检查他们是否知道您的内部IP地址,也可以使用您的手机打开此网站。他们也知道您的手机的本地IP地址。编辑:Im使用JioFi路由器,在移动Im上使用基于Android 9 AOSP的rom上的移动数据
阵列('bond0'=>'10.66.42.83','bond1'=>'hosting Ip address','lo'=>'127.0.0.1',)
我知道了。我在php文件中添加了这段代码,很好的回答,谢谢<代码>拆分()
函数从PHP 5.3.0开始就被弃用。因此建议使用
explode()
而不是绝对正确。不能保证
eth0
是合适的接口。谢谢,这对我来说非常有效。能够设置界面很有帮助!在我的情况下(WiFi本地网络中的本地IP),我必须指定
wlan0
,而不是

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

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

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