PHP 获取国外ip归属地

在项目中需要使用ip获取归属地

目录

获取国外ip归属地

安装

下载ip数据

封装请求

调用

返回结果

总结


获取国外ip归属地

GeoIP2(MaxMind,适合海外 IP)

安装

在项目目录下命令行执行以下命令:

bash 复制代码
composer require maxmind-db/reader

安装后,更新composer自动加载

bash 复制代码
composer dump-autoload --o

下载ip数据

网址https://www.maxmind.com/en/accounts/1283983/geoip/downloads

需要注册账号,使用邮箱就行,免费的。

尝试了只能下载国家级的数据,不允许下载城市级的数据。

封装请求

在fastadmin中封装到common下的library目录下,

调用安装的maxmind库识别ip。

示例如下:

php 复制代码
<?php

namespace app\common\library;


use MaxMind\Db\Reader;

class GeoIP2
{
    /**
     * 获取IP归属地信息
     * @param string $ip 要查询的IP地址(空则取客户端IP)
     * @return array 归属地数组|错误信息
     */
    public static function getLocation($ip = '')
    {
        // 验证IP格式
        if (!filter_var($ip, FILTER_VALIDATE_IP)) {
            return [
                'code' => 0,
                'msg'  => 'IP地址格式错误',
                'data' => []
            ];
        }

        try {
            // 初始化并查询
            $dbPath =  ROOT_PATH . 'public/assets/data/GeoLite2-Country.mmdb';
            $reader = new Reader($dbPath);
            $record = $reader->get($ip);
            $reader->close();

            return [
                'code' => 1,
                'msg'  => '查询成功',
                'data' => [
                    'ip'        => $ip,
                    'country'   => $record['country']['names']['zh-CN'] ?? '未知',
                    'city'      => $record['city']['names']['zh-CN'] ?? '未知',
                    'longitude' => $record['location']['longitude'] ?? 0, // 经度
                    'latitude'  => $record['location']['latitude'] ?? 0 // 纬度
                ]
            ];
        } catch (\Exception $e) {
            // 捕获异常(如IP库异常、查询失败等)
            return [
                'code' => 0,
                'msg'  => '查询失败:' . $e->getMessage(),
                'data' => []
            ];
        }
    }
}

调用

在控制器中调用封装方法,示例如下:

php 复制代码
public function test()
{
    $res = GeoIP2::getLocation('89.44.236.93');
    return json_encode($res);
}

返回结果

测试国外ip,返回结果:

bash 复制代码
{
    "code": 1,
    "msg": "查询成功",
    "data": {
    "ip": "89.44.236.93",
    "country": "意大利",
    "city": "未知",
    "longitude": 0,
    "latitude": 0
    }
}

总结

需要借用GeoIP2库三方类库通过其中的ip库进行识别。

相关推荐
烤代码的吐司君14 小时前
Redis IO 多路复用原理与引入原因深度解析
数据库·redis·php
鹏易灵15 小时前
C++——8.移动语义初探(移动构造、移动赋值)
开发语言·c++·php
KaMeidebaby16 小时前
卡梅德生物技术快报|纳米抗体技术全套实操流程:AFB1 全合成文库淘选 + 分子对接定点突变参数手册
人工智能·python·tcp/ip·算法·机器学习
云栖梦泽在16 小时前
原生 IP、机房 IP、住宅 IP、广播 IP 有何不同?从网络身份到 ASN 识别的技术科普
网络·网络协议·tcp/ip·性能优化
从零开始的代码生活_17 小时前
Linux epoll 多路转接详解
linux·运维·网络·后端·tcp/ip·计算机网络·php
I'm a winner1 天前
【IP核】 Xilinx FPGA LVDS 高速接口,含验证工程与板级测试用例
tcp/ip·fpga开发·测试用例
不吃辣4901 天前
前端应用的离线暂停更新策略:构建稳定可靠的渐进式更新方案
开发语言·前端·php
艾莉丝努力练剑1 天前
OpenCode AI 编程:Ubuntu 24.04 环境安装与使用指南
linux·服务器·网络·人工智能·tcp/ip·ubuntu
liulilittle1 天前
KCC 拥塞控制算法缺陷修复记录(26/07/05)
网络·tcp/ip·计算机网络·c·信息与通信·tcp·通信
钟智强2 天前
我警告了 329 天
git·php·wordpress·webshell