PHP判斷IP并轉(zhuǎn)跳到相應(yīng)城市分站的方法

字號(hào):


    這篇文章主要介紹了PHP判斷IP并轉(zhuǎn)跳到相應(yīng)城市分站的方法,實(shí)例分析了php解析URL及跳轉(zhuǎn)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    本文實(shí)例講述了PHP判斷IP并轉(zhuǎn)跳到相應(yīng)城市分站的方法。分享給大家供大家參考。具體實(shí)現(xiàn)方法如下:
    <?php
    class QQWry{
    var $StartIP=0;
    var $EndIP=0;
    var $Country='';
    var $Local='';
    var $CountryFlag=0;
    // 標(biāo)識(shí) Country位置
    // 0x01,隨后3字節(jié)為Country偏移,沒有Local
    // 0x02,隨后3字節(jié)為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="本地網(wǎng)絡(luò)";return ;}
    elseif(preg_match("/^192/",$dotip)) {$this->Country="局域網(wǎng)";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)|(純真網(wǎng)絡(luò))/","局域網(wǎng)/未知",$this->Country);
    $this->Local=preg_replace("/(CZ88.NET)|(純真網(wǎng)絡(luò))/","局域網(wǎng)/未知",$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;
    }
    }
    ?>
    實(shí)例演示如下:
    $QQWry=new QQWry;
    $QQWry->QQWry("60.31.95.255");
    $country = $QQWry->Country;
    echo $QQWry->Country.",".$QQWry->Local;
    希望本文所述對(duì)大家的php程序設(shè)計(jì)有所幫助。