PHP 获取国内ip归属地

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

目录

获取国内ip归属地

安装

封装请求

调用

返回结果

总结


获取国内ip归属地

使用三方库zoujingli/ip2region。

安装

在项目根目录执行命令:

bash 复制代码
composer require zoujingli/ip2region

在composer.json中出现

安装完成,更新Composer自动加载

bash 复制代码
composer dump-autoload -o

封装请求

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

调用安装的zoujingli/ip2region库识别ip。

示例如下:

php 复制代码
<?php
/**
 * FastAdmin IP归属地查询工具类(基于ip2region)
 * 路径:application/common/library/Ip2Region.php
 */
namespace app\common\library;

use think\Request;

class Ip2Region
{
    /**
     * 获取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 {
            // 初始化ip2region并查询
            $ip2region = new \Ip2Region();
            // memorySearch是内存查询模式,速度最快
            $result = $ip2region->memorySearch($ip);

            // 解析查询结果(格式:国家|区域|省份|城市|运营商)
            $region = explode('|', $result['region']);
            $data = [
                'ip'        => $ip,
                'country'   => $region[0] ?? '未知', // 国家
                'province'  => $region[2] ?? '未知', // 省份(索引2)
                'city'      => $region[3] ?? '未知', // 城市(索引3)
                'isp'       => $region[4] ?? '未知', // 运营商(索引4)
                'area'      => $region[2] . ($region[3] ? '·' . $region[3] : '') // 省·市 简化显示
            ];

            return [
                'code' => 1,
                'msg'  => '查询成功',
                'data' => $data
            ];
        } catch (\Exception $e) {
            // 捕获异常(如IP库异常、查询失败等)
            return [
                'code' => 0,
                'msg'  => '查询失败:' . $e->getMessage(),
                'data' => []
            ];
        }
    }
}

调用

在控制器中调用封装的ip归属地方法,传入一个测试ip.

示例如下:

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

返回结果

bash 复制代码
{
"code": 1,
"msg": "查询成功",
"data": {
    "ip": "211.149.175.128",
    "country": "中国",
    "province": "成都市",
    "city": "电信",
    "isp": "未知",
    "area": "成都市·电信"
  }
}

但这个库主要针对国内,对于国外ip归属地返回信息少,并且有偏差

比如是美国ip,但返回显示为澳大利亚

总结

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

相关推荐
魔力女仆7 小时前
分享一个 JS 鼠标跟随贪吃蛇背景库
开发语言·javascript·计算机外设
2401_894915538 小时前
GEO 搜索优化完整源码从零部署:环境配置、集群搭建全流程
开发语言·python·tcp/ip·算法·unity
麻瓜老宋9 小时前
AI开发C语言应用按步走,表达式计算器calc的第二十二步,分号赋值链式修复、TOKEN_ASSIGN
c语言·开发语言·atomcode
颜x小11 小时前
[C#] C++与c#语法对比
开发语言·c++·c#
weixin_4236521311 小时前
C#使用JObject
开发语言·c#
国科安芯11 小时前
FreeRTOS RISC-V 浮点上下文切换移植:在 IAR 工程中完整保存 FPU 寄存器
java·开发语言·单片机·嵌入式硬件·算法·系统架构·risc-v
weixin_BYSJ198712 小时前
springboot校园自习室管理小程序---附源码32142
java·javascript·spring boot·python·django·flask·php
霸道流氓气质12 小时前
Java中集成Smile 技术教程:从入门到工程实践
java·开发语言
BerrySen17813 小时前
迈向 Next-Gen Java:企业级高并发架构演进与大模型 Agent 落地深度实战
java·开发语言·架构
大鱼>13 小时前
eBPF内核编程:从TC到XDP的全栈可观测性
linux·服务器·php