推荐使用 file_get_contents() 调用 https://api.ipify.org 等可信 HTTP 接口获取本机出口 IPv4 地址,需设置超时、错误处理和 IP 校验,避免依赖 gethostbyname 或 $_SERVER['SERVER_ADDR']。

如何用 PHP 获取本机当前 IPv4 地址(非 127.0.0.1)
PHP 本身没有直接暴露“本机公网 IP”的函数,$_SERVER['SERVER_ADDR'] 返回的是 Web 服务绑定的本地地址(常为 127.0.0.1 或内网 IP),不能代表对外出口 IP。要获取真实出口 IP,必须依赖外部服务或系统命令。
推荐做法是调用可信的 HTTP 接口,例如:
-
https://api.ipify.org(纯文本,只返回 IPv4) -
https://ifconfig.me/ip(响应快,无额外头)
注意:不要用 gethostbyname(gethostname()),它解析的是主机名对应的 A 记录,通常仍是 127.0.0.1 或局域网地址。
用 file_get_contents() 实现轻量级 IP 检测
最简方式是用 file_get_contents() 抓取公开接口,配合超时和错误处理:
立即学习“PHP免费学习笔记(深入)”;
$opts = [
'http' => [
'method' => 'GET',
'timeout' => 3,
'user_agent' => 'PHP-IP-Detector/1.0',
]
];
$context = stream_context_create($opts);
$ip = @file_get_contents('https://api.ipify.org', false, $context);
if ($ip === false || !filter_var(trim($ip), FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
$ip = 'unknown';
}
echo trim($ip);关键点:
- 必须设
timeout,否则网络不通时会卡住脚本 - 用
@抑制警告,再手动判断false和有效性 - 别忘了
trim(),有些接口末尾带换行
定时检测 IP 变化:用 shell 脚本 + PHP 配合 crontab
PHP 不适合长期驻留做轮询,应交给系统级定时任务驱动。典型流程是写一个 PHP 脚本输出当前 IP,再用 shell 对比上一次记录:
1. 创建 /path/to/check-ip.php,末尾输出纯 IP(不带 HTML、不 echo 其他内容)
2. 写 shell 脚本 check-ip.sh:
#!/bin/bash
IP_FILE="/tmp/last-ip.txt"
CURRENT_IP=$(php /path/to/check-ip.php 2>/dev/null | tr -d '\r\n')
if [ -f "$IP_FILE" ]; then
LAST_IP=$(cat "$IP_FILE")
if [ "$CURRENT_IP" != "$LAST_IP" ]; then
echo "IP changed: $LAST_IP → $CURRENT_IP"
echo "$CURRENT_IP" > "$IP_FILE"
# 这里可追加通知逻辑,如 mail / webhook
fi
else
echo "$CURRENT_IP" > "$IP_FILE"
fi3. 加入 crontab(每 5 分钟执行一次):
*/5 * * * * /path/to/check-ip.sh >> /var/log/ip-check.log 2>&1
常见失败原因与绕过限制的方法
很多用户卡在「本地开发环境无法获取公网 IP」——这很正常,因为家用宽带没有固定公网 IP,且路由器做了 NAT。此时 curl https://api.ipify.org 返回的是你家路由器的 WAN 口 IP,但该 IP 可能被运营商回收、复用,甚至被封禁。
如果你实际想监控的是「服务器是否被分配了新 IP」,请确认:
- 运行脚本的机器是否有公网路由权限(云服务器 OK,家庭 NAS 通常不行)
-
防火墙是否放行出站 HTTPS(
443) - 某些 IDC 禁止频繁请求第三方 API,可加随机延迟或换备用接口(如
https://icanhazip.com) - PHP 是否禁用了
allow_url_fopen?若禁用,改用curl_init()
真正需要实时感知变化的场景(比如动态 DNS 更新),建议直接调用服务商提供的 API(如阿里云 DescribeEipAddresses),而不是靠轮询公网接口——后者不可靠,也容易被限流。











