TP 判断IP是否在国内

yizhihongxing

环境ThinkPHP+Redis

1.IP保存文件,文件名自定义,与后文对应

TP 判断IP是否在国内

 

 

 2.获取IP信息脚本.sh文件

#!/bin/bash
#variables

ip_txt_path=/www/wwwroot/checkip/china_ip.txt;
ip_url='http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest';
php_path=/www/server/php/72/bin/php
script_path=/www/wwwroot/checkip/putip2redis.php

#mv old txt

cur_time=$(date +"%Y%m%d%H%M%S");
if [ -f ${ip_txt_path} ];then
       mv ${ip_txt_path} ${ip_txt_path}_${cur_time};
fi

#download

/usr/bin/curl ${ip_url} | grep ipv4 | grep CN | awk -F\| '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }' >${ip_txt_path}

#parse 2 redis

echo "begin parse ip\n";
${php_path} ${script_path}

3.将IP信息保存到Redis中,上图中putip2redis.php文件

<?php
/*

解析国内ip地址列表,以ip地址的第一段为索引,
保存到redis中的一个hash中

by 刘宏缔
2020.04.02

*/
//------------------------------------------------settings
ini_set("display_errors","On");
error_reporting(E_ALL);
//------------------------------------------------constant
define("REDIS_SERVER", "127.0.0.1");
define("REDIS_PORT", "6379");
define("IP_FILE", "/www/wwwroot/isipchina/china_ip.txt");
define("IP_HASH_NAME", "china_ip_hash");
//------------------------------------------------link 4 redis
$redis_link = new \Redis();
$redis_link->connect(REDIS_SERVER,REDIS_PORT);

//------------------------------------------------main
set_ip_list(IP_FILE);

//------------------------------------------------function
//处理所有的ip范围到redis
function set_ip_list($ip_file) {
    //从文件中得到所有的国内ip
    $arr_all = file($ip_file);

    //遍历,得到所有的第一段
    $arr_first = array();
    foreach ($arr_all as $k => $rangeone) {
        $rangeone = trim($rangeone);
        if ($rangeone == "") {
            continue;
        }
        
        $first = explode(".", $rangeone);
        if (isset($first[0]) && $first[0]!='') {
           $arr_first[] = $first[0];
        }
    }

    //对所有的第一段去除重复
    $arr_first = array_unique($arr_first);

    //得到线上hash的所有key
    $arr_hkeys = hash_keys(IP_HASH_NAME);

    //如果一个线上已存在的key不再存在于新ip的第一段的数组中
    //需要从线上hash中删除
    if (is_array($arr_hkeys) && sizeof($arr_hkeys)>0) {
        foreach($arr_hkeys as $k => $hkey_one) {
           if (!in_array($hkey_one, $arr_first)) {
                echo "will delete :".$hkey_one."\n";
                hash_delete_hkey(IP_HASH_NAME,$hkey_one);
            }
        }
    }

    //得到每个第一段下面对应的所有ip地址段,保存到redis
    foreach ($arr_first as $k => $first) {
       add_a_list_by_first($first,$arr_all);  
    }

}


//把所有的第一段为指定数字的ip,添加到redis
function add_a_list_by_first($first,$arr) {

     $arr_line = array();
     foreach ($arr as $k => $rangeone) {
          $rangeone = trim($rangeone);
          $first_a = explode(".", $rangeone);
          if (!isset($first_a[0]) || $first_a[0] == "") {
             continue;
          }
          $cur_first = $first_a[0];
          if ($cur_first == $first) {

              $line = get_line_by_rangeone($rangeone);
              //echo "line:".$line."\n";
              $arr_line[] = $line;
          } else {
             continue;
          }
      }


      if (sizeof($arr_line) >0) {
          $key_name = $first;
          hash_set(IP_HASH_NAME,$key_name,$arr_line);
      }
}


//得到一个ip地址段的起始范围
function get_line_by_rangeone($networkRange) {

        $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;

        $line = $network_start."--".$network_end;
        return $line;
}


//redis set 一个数组到hash
function hash_set($hash_name,$key_name,$arr_value){
      global $redis_link;
      $str_value = json_encode($arr_value);
      $b = $redis_link->hset($hash_name, $key_name, $str_value);
}

//返回redis hash中
function hash_keys($hash_name) {
      global $redis_link;
      $arr = $redis_link->hKeys($hash_name);
      return $arr;
}

//删除一个hash的hkey
function hash_delete_hkey($hash_name,$key_name) {
      global $redis_link;
      $redis_link->hdel($hash_name, $key_name);
}

?>

4.运行.sh文件初始化redis数据

5.添加类文件到TP的extend

TP 判断IP是否在国内

<?php
namespace ipxx;
class Ipcheck
{
//------------------------------------------------function
    function getRealIp()//判断来源IP
    {

        return $_SERVER['REMOTE_ADDR'];
    }


//判断一个ip是否属于china
    function is_ip_in_china($ip)
    {
//------------------------------------------------link 2 redis
       
        $ip = trim($ip);
        $first_a = explode(".", $ip);
        if (!isset($first_a[0]) || $first_a[0] == "") {
            //ip有误,按国外算
            return false;
        }
        $first = $first_a[0];

        $arr_range = $this->hash_get(IP_HASH_NAME, $first);
        if (!is_array($arr_range) || sizeof($arr_range) == 0) {
            return false;
        }

        if ($this->is_ip_in_arr_range($ip, $arr_range) == true) {
            return true;
        } else {
            return false;
        }
    }

//判断一个ip是否属于ip的range数组
    function is_ip_in_arr_range($ip, $arr_range)
    {
        $ip_long = (double)(sprintf("%u", ip2long($ip)));


        foreach ($arr_range as $k => $one) {
            $one = trim($one);
            //echo $one.":\n";
            $arr_one = explode("--", $one);

            if (!isset($arr_one[0]) || !isset($arr_one[1])) {
                continue;
            }

            $begin = $arr_one[0];
            $end = $arr_one[1];

            if ($ip_long >= $begin && $ip_long <= $end) {
                return true;
            }
        }
        return false;
    }


//得到一个hash中对应key的value
    function hash_get($hash_name, $key_name)
    {
       
//------------------------------------------------link 2 redis
        $redis_link = new \Redis();
        $redis_link->connect(REDIS_SERVER,REDIS_PORT);
        $str = $redis_link->hget($hash_name, $key_name);
        $arr = json_decode($str, true);
        return $arr;
    }
}

?>

6.引用类调用函数判断IP

use ipxx\Ipcheck;





public function test()
    {
        define("REDIS_SERVER", "127.0.0.1");
        define("REDIS_PORT", "6379");
        define("IP_HASH_NAME", "china_ip_hash");

        $ipcheck = new Ipcheck();
        $redis_link = new \Redis();
        $redis_link->connect(REDIS_SERVER,REDIS_PORT);
        $userip=$_SERVER['REMOTE_ADDR'];
         $is_in = $ipcheck->is_ip_in_china($userip);//判断一个ip是否国内的ip
           if ($is_in == true) {
          echo "china";
        } else {
          echo "foreign";
        }
    }

 

  


原文链接:https://www.cnblogs.com/catyxiao/p/17228599.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:TP 判断IP是否在国内 - Python技术站

(0)
上一篇 2023年4月17日
下一篇 2023年4月17日

相关文章

  • php获取目录所有文件并将结果保存到数组(实例)

    下面我将为您详细讲解“php获取目录所有文件并将结果保存到数组”的完整攻略。 获取目录所有文件 要获取目录中所有文件,我们可以使用 scandir() 函数。这个函数返回一个数组,包含目录中的所有文件和子目录的名称。示例如下: $dir = "/path/to/directory"; // 目录路径 $file_list = scandi…

    PHP 2023年5月26日
    00
  • PHP使用DOMDocument类生成HTML实例(包含常见标签元素)

    下面给出一份完整的攻略,希望能够对您有所帮助。 PHP使用DOMDocument类生成HTML实例(包含常见标签元素) DOM是什么? DOM(文档对象模型)是一种编程接口,用来访问和操作XML文件或HTML文件。DOM将文档解析为一个节点树,开发者可以通过DOM接口进行对节点树的操作,比如增加、删除、修改、查询等。 DOMDocument类 DOMDocu…

    PHP 2023年5月26日
    00
  • PHP字符串中特殊符号的过滤方法介绍

    一、PHP字符串中特殊符号的过滤方法介绍 在PHP字符串的处理中,常常需要对字符串中的特殊符号进行过滤和处理,防止出现安全隐患和功能错误。本文将详细介绍PHP字符串中特殊符号的过滤方法。 二、HTML标签和JavaScript脚本注入漏洞 在PHP应用开发中,常常会有用户输入的情况,比如表单提交、评论或留言等。这就可能导致HTML标签和JavaScript脚…

    PHP 2023年5月26日
    00
  • php实现往pdf中加数字签名操作示例【附源码下载】

    我来为您详细讲解“php实现往pdf中加数字签名操作示例【附源码下载】”的完整攻略。这个操作需要用到php的一些相关库和工具,具体步骤如下: 环境准备 安装php环境,在命令行中输入php -v,查看是否已经安装成功。 安装OpenSSL扩展库,用于数字签名相关操作,可以在命令行中输入php -m | grep OpenSSL 检查是否已经安装成功。 下载相…

    PHP 2023年5月26日
    00
  • php中in_array函数用法分析

    PHP中in_array函数用法分析 什么是in_array函数? in_array()函数是PHP内置函数之一,用来检查一个值是否存在于数组中。它可以帮助我们快速地判断一个元素是否在一个数组中存在,返回值为布尔类型。通俗地说,in_array()函数就是用来判断一个值是否在数组中存在的。 下面我们来看一下in_array()函数的具体语法: in_arra…

    PHP 2023年5月29日
    00
  • php字符串截取的简单方法

    下面是关于“PHP字符串截取的简单方法”完整攻略的介绍: 1. 使用substr函数进行截取 PHP提供了substr函数,可以很方便地截取一个字符串的一部分。该函数有3个参数,分别是要截取的字符串、起始位置和截取的长度。以下是示例代码: $str = "Hello World"; $substr = substr($str, 0, 5)…

    PHP 2023年5月26日
    00
  • PHP基础教程(php入门基础教程)一些code代码

    下面将针对PHP基础教程(php入门基础教程)的攻略进行介绍。 简介 PHP是一款开源的服务器端脚本语言,通常用于web开发,它可以动态输出HTML、图片、PDF文件等内容,同时也支持与各种数据库进行交互等功能。PHP的代码可以嵌入HTML页面中,只要安装好PHP解析器,就可以在服务器上运行PHP代码并生成动态页面。 安装 首先需要从PHP官网下载对应版本的…

    PHP 2023年5月23日
    00
  • php实现递归与无限分类的方法

    关于 “PHP实现递归与无限分类的方法”,我给你提供以下攻略: 1. 什么是递归 递归是指一个函数不断调用自身的过程。在 PHP 中,递归可以非常方便地处理一些数据结构,如树形结构、嵌套数组等。 递归函数一般都包含两部分:递归结束条件和递归过程。 2. 实现递归的方法 实现递归的最常用方式是递归函数。下面是一个简单的递归函数的示例: function rec…

    PHP 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部