0

0

php获取本机ip返回多个值咋处理_php筛选有效ip法【技巧】

絕刀狂花

絕刀狂花

发布时间:2026-01-26 08:42:09

|

703人浏览过

|

来源于php中文网

原创

$_SERVER['SERVER_ADDR'] 返回127.0.0.1是因为PHP通过FastCGI或反向代理运行时,取的是Web服务器监听的本地socket地址;真正本机对外IP需查系统网络接口而非HTTP上下文。

php获取本机ip返回多个值咋处理_php筛选有效ip法【技巧】

为什么 $_SERVER['SERVER_ADDR'] 有时返回 127.0.0.1 而不是真实本机 IP

PHP 运行在 Web 服务器(如 Nginx/Apache)背后时,$_SERVER['SERVER_ADDR'] 实际取的是该 Web 服务监听的 socket 地址。如果 PHP 是通过 FastCGI 或反向代理(比如 Nginx → php-fpm)运行,且 Nginx 配置了 fastcgi_pass 127.0.0.1:9000,那么 php-fpm 收到的请求中 SERVER_ADDR 就是 127.0.0.1,而非你期望的网卡真实 IP。

真正反映本机对外 IP 的,得查系统网络接口,而不是依赖 HTTP 请求上下文。

gethostbyname(gethostname()) 获取本机默认出口 IP 的局限性

这个组合看似简单,但实际不可靠:

  • gethostname() 返回的是系统主机名(如 myserver.local),不一定能被 DNS 解析,或可能解析到 127.0.0.1
  • 即使解析成功,也只返回首个 A 记录,无法区分内网/外网、IPv4/IPv6、多网卡优先级
  • 在容器或云主机中,主机名常指向 loopback 或内部 DNS,完全不反映公网出口

所以它只适合开发环境快速测试,不能用于生产判断“本机对外可访问 IP”。

立即学习PHP免费学习笔记(深入)”;

可靠获取本机有效 IPv4 地址的实操方法

推荐用 netstatip 命令结合 PHP 的 shell_exec() 筛选,再过滤掉无效地址。关键逻辑是:找“UP”状态、非 loopback、非 link-local(169.254.x.x)、非文档保留地址(192.168.x.x / 10.x.x.x / 172.16–31.x.x)的 IPv4。

Artifact News
Artifact News

由AI驱动的个性化新闻推送

下载

示例代码(Linux):

$ips = array_filter(array_map('trim', explode("\n", shell_exec("ip -4 addr show | grep 'inet ' | awk '{print $2}' | cut -d/ -f1"))), function($ip) {
    return !in_array($ip, ['127.0.0.1', '0.0.0.0']) && 
           !filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
});
$main_ip = !empty($ips) ? current($ips) : '127.0.0.1';

注意点:

  • 必须用 ip -4 而非 ifconfig,后者在新版系统中已被弃用,输出不稳定
  • FILTER_FLAG_NO_PRIV_RANGE 排除私有网段,FILTER_FLAG_NO_RES_RANGE 排除保留地址(含 169.254.x.x)
  • 若需支持 IPv6,改用 ip -6 并单独处理 fe80::/10(链路本地)和 ::1

在 Docker 或 Kubernetes 中怎么拿宿主机真实 IP

容器内执行上述命令拿到的只是容器网络的 IP(如 172.17.0.2),不是宿主机物理网卡地址。此时不能依赖 PHP 自查,而应:

  • 启动容器时通过 -e HOST_IP=192.168.1.100 显式传入(需运维配合)
  • 读取宿主机的 /proc/sys/net/ipv4/conf/all/forwarding 或挂载 /sys/class/net/ 判断,但路径不可移植
  • 更稳妥的做法:由部署层(Ansible/Terraform/CI)把真实 IP 写入配置文件环境变量,PHP 只负责读取

硬要在容器里“猜”宿主机 IP 很容易出错——比如 Docker 默认 bridge 模式下,宿主机在容器看来是 172.17.0.1,但这个地址在不同机器上不一致,也不代表宿主机对外 IP。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2890

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1731

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1564

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

1099

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1546

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1277

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1649

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1309

2023.11.13

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

58

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 9.4万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.1万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号