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

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

  <?php    class QQWry{      var $StartIP=0;      var $EndIP=0;      var $Country='';      var $Local='';      var $CountryFlag=0;  // 标识 Country位置    // 0x01,随后3字节为Country偏移,没有Local    // 0x02,随后3字节为Country偏移,接着是Local    // 其他,Country,Local,Local有类似的压缩。可能多重引用。      var $fp;      var $FirstStartIp=0;      var $LastStartIp=0;      var $EndIpOff=0 ;      function getStartIp($RecNo){       $offset=$this->FirstStartIp+$RecNo * 7 ;       @fseek($this->fp,$offset,SEEK_SET) ;       $buf=fread($this->fp ,7) ;       $this->EndIpOff=ord($buf[4])+(ord($buf[5])*256)+(ord($buf[6])*256*256);     $this->StartIp=ord($buf[0])+(ord($buf[1])*256)+(ord($buf[2])*256*256)+(ord($buf[3])*256*256*256);     return $this->StartIp;    }    function getEndIp(){       @fseek ( $this->fp , $this->EndIpOff , SEEK_SET ) ;       $buf=fread ( $this->fp , 5 ) ;       $this->EndIp=ord($buf[0]) + (ord($buf[1])*256) + (ord($buf[2])*256*256) + (ord($buf[3])*256*256*256);     $this->CountryFlag=ord ( $buf[4] ) ;       return $this->EndIp ;      }      function getCountry(){       switch ( $this->CountryFlag ) {        case 1:        case 2:         $this->Country=$this->getFlagStr ( $this->EndIpOff+4) ;         //echo sprintf('EndIpOffset=(%x)',$this->EndIpOff );         $this->Local=( 1 == $this->CountryFlag )? '' : $this->getFlagStr ( $this->EndIpOff+8);       break ;        default :         $this->Country=$this->getFlagStr ($this->EndIpOff+4);         $this->Local=$this->getFlagStr ( ftell ( $this->fp ));       }      }      function getFlagStr ($offset){       $flag=0 ;       while(1){        @fseek($this->fp ,$offset,SEEK_SET) ;        $flag=ord(fgetc($this->fp ) ) ;        if ( $flag == 1 || $flag == 2 ) {         $buf=fread ($this->fp , 3 ) ;         if ($flag==2){          $this->CountryFlag=2;          $this->EndIpOff=$offset - 4 ;         }         $offset=ord($buf[0]) + (ord($buf[1])*256) + (ord($buf[2])* 256*256);        }        else{         break ;        }       }       if($offset<12)        return '';       @fseek($this->fp , $offset , SEEK_SET ) ;           return $this->getStr();      }      function getStr ( )      {       $str='' ;       while ( 1 ) {        $c=fgetc ( $this->fp ) ;        //echo "$cn" ;        if(ord($c[0])== 0 )         break ;        $str.= $c ;       }       //echo "$str n";       return $str ;      }      function qqwry ($dotip='') {        if( !is_string($dotip) || $dotip==''){return;}        if(preg_match("/^127/",$dotip)){$this->Country="本地网络";return ;}        elseif(preg_match("/^192/",$dotip)) {$this->Country="局域网";return ;}       $nRet;       $ip=$this->IpToInt ( $dotip );       $this->fp= fopen(__QQWRY__, "rb");       if ($this->fp == NULL) {         $szLocal= "OpenFileError";        return 1;       }     @fseek ( $this->fp , 0 , SEEK_SET );     $buf=fread ( $this->fp , 8 );     $this->FirstStartIp=ord($buf[0]) + (ord($buf[1])*256) + (ord($buf[2])*256*256) + (ord($buf[3])*256*256*256);     $this->LastStartIp=ord($buf[4]) + (ord($buf[5])*256) + (ord($buf[6])*256*256) + (ord($buf[7])*256*256*256);     $RecordCount= floor(($this->LastStartIp - $this->FirstStartIp) / 7);     if ($RecordCount <= 1){        $this->Country="FileDataError";        fclose($this->fp) ;        return 2 ;       }       $RangB= 0;       $RangE= $RecordCount;       // Match ...       while ($RangB < $RangE-1)       {       $RecNo= floor(($RangB + $RangE) / 2);     $this->getStartIp ( $RecNo ) ;        if ( $ip == $this->StartIp )        {         $RangB=$RecNo ;         break ;        }       if ($ip>$this->StartIp)        $RangB= $RecNo;       else       $RangE= $RecNo;       }       $this->getStartIp ( $RangB ) ;       $this->getEndIp ( ) ;       if ( ( $this->StartIp <= $ip ) && ( $this->EndIp >= $ip ) ){        $nRet=0 ;        $this->getCountry ( ) ;        //这样不太好..............所以..........        $this->Local=str_replace("area error", "",$this->Local);       }       else{        $nRet=3 ;        $this->Country='未知' ;        $this->Local='' ;       }       fclose ( $this->fp );    $this->Country=preg_replace("/(CZ88.NET)|(纯真网络)/","局域网/未知",$this->Country);  $this->Local=preg_replace("/(CZ88.NET)|(纯真网络)/","局域网/未知",$this->Local);    //////////////看看 $nRet在上面的值是什么0和3,于是将下面的行注释掉        return $nRet ;    //return "$this->Country $this->Local";#如此直接返回位置和国家便可以了      }      function IpToInt($Ip) {       $array=explode('.',$Ip);       $Int=($array[0] * 256*256*256) + ($array[1]*256*256) + ($array[2]*256) + $array[3];     return $Int;      }     }    ?>

实例演示如下:

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

希望本文所述对大家的php程序设计有所帮助。

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

郑重声明:本网站发布的内容(图片、视频和文字)以及用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服