当前位置:首页 > PHP教程 > php应用 > 列表

PHP判断IP并转跳到相应城市分站的方法

发布:smiling 来源: PHP粉丝网  添加日期:2021-05-18 09:56:54 浏览: 评论:0 

这篇文章主要介绍了PHP判断IP并转跳到相应城市分站的方法,实例分析了php解析URL及跳转的技巧,具有一定参考借鉴价值,需要的朋友可以参考下。

本文实例讲述了PHP判断IP并转跳到相应城市分站的方法,分享给大家供大家参考,具体实现方法如下:

  1. <?php   
  2. class QQWry{   
  3.   var $StartIP=0;   
  4.   var $EndIP=0;   
  5.   var $Country='';   
  6.   var $Local='';   
  7.   var $CountryFlag=0; 
  8. // 标识 Country位置   
  9. // 0x01,随后3字节为Country偏移,没有Local   
  10. // 0x02,随后3字节为Country偏移,接着是Local   
  11. // 其他,Country,Local,Local有类似的压缩。可能多重引用。   
  12.   var $fp;   
  13.   var $FirstStartIp=0;   
  14.   var $LastStartIp=0;   
  15.   var $EndIpOff=0 ;   
  16.   function getStartIp($RecNo){   
  17.    $offset=$this->FirstStartIp+$RecNo * 7 ;   
  18.    @fseek($this->fp,$offset,SEEK_SET) ;   
  19.    $buf=fread($this->fp ,7) ;   
  20.    $this->EndIpOff=ord($buf[4])+(ord($buf[5])*256)+(ord($buf[6])*256*256); 
  21.    $this->StartIp=ord($buf[0])+(ord($buf[1])*256)+(ord($buf[2])*256*256)+(ord($buf[3])*256*256*256); 
  22.    return $this->StartIp; 
  23.   } 
  24.   function getEndIp(){   
  25.    @fseek ( $this->fp , $this->EndIpOff , SEEK_SET ) ;   
  26.    $buf=fread ( $this->fp , 5 ) ;   
  27.    $this->EndIp=ord($buf[0]) + (ord($buf[1])*256) + (ord($buf[2])*256*256) + (ord($buf[3])*256*256*256); 
  28.    $this->CountryFlag=ord ( $buf[4] ) ;   
  29.    return $this->EndIp ;   
  30.   }   
  31.   function getCountry(){   
  32.    switch ( $this->CountryFlag ) {   
  33.     case 1:   
  34.     case 2:   
  35.      $this->Country=$this->getFlagStr ( $this->EndIpOff+4) ;   
  36.      //echo sprintf('EndIpOffset=(%x)',$this->EndIpOff );   
  37.      $this->Local=( 1 == $this->CountryFlag )? '' : $this->getFlagStr ( $this->EndIpOff+8); 
  38.      break ;   
  39.     default :   
  40.      $this->Country=$this->getFlagStr ($this->EndIpOff+4);   
  41.      $this->Local=$this->getFlagStr ( ftell ( $this->fp ));   
  42.    }   
  43.   }   
  44.   function getFlagStr ($offset){   
  45.    $flag=0 ;   
  46.    while(1){   
  47.     @fseek($this->fp ,$offset,SEEK_SET) ;   
  48.     $flag=ord(fgetc($this->fp ) ) ;   
  49.     if ( $flag == 1 || $flag == 2 ) {   
  50.      $buf=fread ($this->fp , 3 ) ;   
  51.      if ($flag==2){   
  52.       $this->CountryFlag=2;   
  53.       $this->EndIpOff=$offset - 4 ;   
  54.      }   
  55.      $offset=ord($buf[0]) + (ord($buf[1])*256) + (ord($buf[2])* 256*256);   
  56.     }   
  57.     else{   
  58.      break ;   
  59.     }   
  60.    }   
  61.    if($offset<12)   
  62.     return '';   
  63.    @fseek($this->fp , $offset , SEEK_SET ) ;   
  64.     
  65.    return $this->getStr();   
  66.   }   
  67.   function getStr ( )   
  68.   {   
  69.    $str='' ;   
  70.    while ( 1 ) {   
  71.     $c=fgetc ( $this->fp ) ;   
  72.     //echo "$cn" ;   
  73.     if(ord($c[0])== 0 )   
  74.      break ;   
  75.     $str.= $c ;   
  76.    }   
  77.    //echo "$str n";   
  78.    return $str ;   
  79.   }   
  80.   function qqwry ($dotip='') {   
  81.     if( !is_string($dotip) || $dotip==''){return;}   
  82.     if(preg_match("/^127/",$dotip)){$this->Country="本地网络";return ;}   
  83.     elseif(preg_match("/^192/",$dotip)) {$this->Country="局域网";return ;}   
  84.    $nRet;   
  85.    $ip=$this->IpToInt ( $dotip );   
  86.    $this->fp= fopen(__QQWRY__, "rb");   
  87.    if ($this->fp == NULL) {   
  88.      $szLocal"OpenFileError";   
  89.     return 1;   
  90.    } 
  91.    @fseek ( $this->fp , 0 , SEEK_SET ); 
  92.    $buf=fread ( $this->fp , 8 ); 
  93.    $this->FirstStartIp=ord($buf[0]) + (ord($buf[1])*256) + (ord($buf[2])*256*256) + (ord($buf[3])*256*256*256); 
  94.    $this->LastStartIp=ord($buf[4]) + (ord($buf[5])*256) + (ord($buf[6])*256*256) + (ord($buf[7])*256*256*256); 
  95.    $RecordCountfloor(($this->LastStartIp - $this->FirstStartIp) / 7); 
  96.    if ($RecordCount <= 1){   
  97.     $this->Country="FileDataError";   
  98.     fclose($this->fp) ;   
  99.     return 2 ;   
  100.    }   
  101.    $RangB= 0;   
  102.    $RangE$RecordCount;   
  103.    // Match ...   
  104.    while ($RangB < $RangE-1)   
  105.    {   
  106.    $RecNofloor(($RangB + $RangE) / 2); 
  107.    $this->getStartIp ( $RecNo ) ;   
  108.     if ( $ip == $this->StartIp )   
  109.     {   
  110.      $RangB=$RecNo ;   
  111.      break ;   
  112.     }   
  113.    if ($ip>$this->StartIp)   
  114.     $RangB$RecNo;   
  115.    else 
  116.     $RangE$RecNo;   
  117.    }   
  118.    $this->getStartIp ( $RangB ) ;   
  119.    $this->getEndIp ( ) ;   
  120.    if ( ( $this->StartIp <= $ip ) && ( $this->EndIp >= $ip ) ){   
  121.     $nRet=0 ;   
  122.     $this->getCountry ( ) ;   
  123.     //这样不太好..............所以..........   
  124.     $this->Local=str_replace("area error""",$this->Local);   
  125.    }   
  126.    else{   
  127.     $nRet=3 ;   
  128.     $this->Country='未知' ;   
  129.     $this->Local='' ;   
  130.    }   
  131.    fclose ( $this->fp );   
  132. $this->Country=preg_replace("/(CZ88.NET)|(纯真网络)/","局域网/未知",$this->Country); 
  133. $this->Local=preg_replace("/(CZ88.NET)|(纯真网络)/","局域网/未知",$this->Local);   
  134. //////////////看看 $nRet在上面的值是什么0和3,于是将下面的行注释掉   
  135.     return $nRet ;   
  136. //return "$this->Country $this->Local";#如此直接返回位置和国家便可以了   
  137.   }   
  138.   function IpToInt($Ip) {   
  139.    $array=explode('.',$Ip);   
  140.    $Int=($array[0] * 256*256*256) + ($array[1]*256*256) + ($array[2]*256) + $array[3]; 
  141.    return $Int;   
  142.   }   
  143.  }   
  144. ?> 

实例演示如下:

  1. $QQWry=new QQWry; 
  2. $QQWry->QQWry("60.31.95.255"); 
  3. $country = $QQWry->Country; 
  4. echo $QQWry->Country.",".$QQWry->Local;

Tags: PHP转跳到相应城市

分享到: