ThinkPHP 中检测服务器出口 IP 的方法

作者名:Lisa Farrell · 2026-06-01

在 ThinkPHP 项目中,服务端直接请求 https://my.ipin.io/info 可以检测当前服务器访问外网时使用的出口 IP。这个场景适合运维诊断、代理节点检查、云服务器地区确认,而不是访客 IP 个性化。

接口说明

服务端调用检测服务器出口 IP,返回的是服务器访问外网时暴露的 IP、国家、地区和城市信息。

{"ip":"185.220.236.7","country":"TW","region":"Taiwan","city":"Taipei"}

应用场景

这些场景都能体现 IP 信息接口价值,并明确区分服务器 IP 与访客 IP。

  • 检查服务器公网 IP 是否变化
  • 确认 VPS、云主机或代理节点所在地区
  • 在后台面板展示服务器出口 IP
  • 排查 NAT、代理、CDN 后的网络出口问题
  • 监控多节点服务器的出口国家和城市

实现逻辑

实现前先确认请求发起方:服务器发起请求得到服务器 IP,浏览器发起请求得到访客 IP。

  • 服务端请求 https://my.ipin.io/info
  • 接口返回服务器出口 IP 的 JSON 信息
  • 控制器把结果传给模板
  • 模板显示 ip、country、region、city
  • 接口失败时显示默认值

代码示例

以下代码都直接使用 https://my.ipin.io/info,注释和界面文字均已本地化。

ThinkPHP Controller

<?php
namespace app\controller;

use app\BaseController;

class IpController extends BaseController
{
    public function server()
    {
        $default = [
            'ip' => 'Unknown',
            'country' => 'Unknown',
            'region' => 'Unknown',
            'city' => 'Unknown',
        ];

        try {
            // 服务端调用 /info:检测服务器当前出口 IP。
            $json = @file_get_contents('https://my.ipin.io/info');
            $data = json_decode($json, true);
            $info = is_array($data) ? array_merge($default, $data) : $default;
        } catch (\Throwable $e) {
            $info = $default;
        }

        return view('server_ip', ['info' => $info]);
    }
}

server_ip.html

<div class="ip-card">
  <h2>服务器出口 IP 信息</h2>
  <p>IP:{$info.ip|default='Unknown'}</p>
  <p>Country:{$info.country|default='Unknown'}</p>
  <p>Region:{$info.region|default='Unknown'}</p>
  <p>City:{$info.city|default='Unknown'}</p>
</div>

SEO 与体验建议

默认内容应完整可读,地区化内容作为增强体验出现。这样搜索引擎可以抓取稳定内容,接口失败时用户也能继续使用页面。

常见错误

以下问题会影响文章准确性、代码可运行性和接口介绍可信度。

  • 不要把服务端结果说成访客 IP
  • 服务器诊断页面不应公开暴露
  • 接口请求应设置超时
  • 不要在高流量页面频繁检测
  • 后台页面应增加权限控制

总结

该场景的重点是服务器出口 IP 诊断。服务端调用接口能帮助确认服务器、代理或云节点在公网中的实际 IP 信息。

常见问题

下面的问答围绕本文场景单独整理,问题和答案都与当前文章直接相关。

问题:这篇 ThinkPHP 文章检测的是谁的 IP?
答案:它检测的是服务器访问外网时使用的出口 IP,不是访客浏览器 IP。
问题:为什么服务端检测仍然有实际意义?
答案:它适合 VPS 诊断、代理节点检测、云主机地区确认和后台运维面板。
问题:这个检测页面应该公开吗?
答案:不建议公开,应放在管理员后台并增加登录与权限控制。
问题:接口请求失败会不会影响页面?
答案:示例保留默认值和异常处理,失败时不会中断页面。
问题:如果要判断访客 IP 应该怎么做?
答案:应让访客浏览器直接请求接口,而不是让服务器代为请求。