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

5年以前  |  阅读数:339 次  |  编程语言:PHP 

本文实例讲述了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分页显示制作详细讲解
SSH 登录失败:Host key verification failed
将二进制数据转为16进制以便显示
获取IMSI
获取IMEI
Java生成UUID
PHP自定义函数获取搜索引擎来源关键字的方法
让你成为最历害的git提交人
在Zeus Web Server中安装PHP语言支持
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php+ajax+json 详解及实例代码
Yii2汉字转拼音类的实例代码
php封装的page分页类完整实例
php数组合并array_merge()函数使用注意事项
PHP设计模式之工厂模式与单例模式
PHP实现简单爬虫的方法
php实现数组中索引关联数据转换成json对象的方法
wget使用技巧