PHP判断IP属于国内国外

方案一 使用淘宝接口
 /**
  * 使用淘宝接口 判断ip
  * @param $ip
  * @return bool
 */
   public function judgeIpByTaobao($ip)
   {   
       $url = "http://ip.taobao.com/service/getIpInfo.php?ip=".$ip;
       $res = file_get_contents($url);
       if (!empty($res)) {
          $ipData = json_decode($res,true);
          if ($ipData['code']==0 && in_array($ipData['data']['country_id'],['CN','HK','TW'])) {
              return true;
          }
       }
       return false;
   }

方案二 定期获取Apnic分配给中国的IP网段 列表
Apnic是全球5个地区级的Internet注册机构(RIR)之一,负责亚太地区的以下一些事务: 
(1)分配IPv4和IPv6地址空间,AS号 
(2)为亚太地区维护Whois数据库 
(3)反向DNS指派 
(4)在全球范围内作为亚太地区的Internet社区的代表

1) 使用shell定期获取IP网段列表

curl 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | grep ipv4 | grep CN | awk -F\| '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }' >china_ip.txt
1
最终得到的IP网段数据如下

1.0.1.0/24
1.0.2.0/23
1.0.8.0/21
1.0.32.0/19
1.1.0.0/24
1.1.2.0/23
1.1.4.0/22
1.1.8.0/24
...省略.....
223.255.252.0/23
返回约8000个网段数据

2)使用函数判断指定IP是否存在指定网段中

/**
     * 给定一个ip 一个网段 判断该ip是否属于该网段
     * @param $ip
     * @param $networkRange
     * @return bool 属于返回true 不属于返回false
     */
   public static function judge($ip, $networkRange)
   {
        $ip = (double) (sprintf("%u", ip2long($ip)));
        $s = explode('/', $networkRange);
        $network_start = (double) (sprintf("%u", ip2long($s[0])));
        $network_len = pow(2, 32 - $s[1]);
        $network_end = $network_start + $network_len - 1;

        if ($ip >= $network_start && $ip <= $network_end) {
            return true;
        }
        return false;
   }

3)把网段数据处理后 保存到redis中

使用网段掩码,ip2long函数进行相关计算得到网段的开始值与结束值(见上面的函数),根据自己的情况,选择最合适的数据结构,保存到redis中。

4)快速比较 
指定IP使用ip2long函数得到ip转为整数的值,判断值是否在任一一个区间中。
————————————————
版权声明:本文为CSDN博主「生气的男孩」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34853874/article/details/75071994

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值