地区名にIPアドレスを使用してPHP +純粋なIPデータベース

最近の同社は、ユーザー名とIPアドレスの転送エリア名を行うためのプロセスでは、PHP +純粋なIPデータベースを使用する方法、フィルタを得ることが決定し、本日より強力であるブラシシステムをコメントしています。例えば、私は、福州、福建省の友人だったこと私は「ttlsa福州の友人」で、デフォルトのユーザー名にコメントし、そうどれだけ多くの相互作用の州を増加させることができ、かつ、少なくとも具体的な実践について何かを言うために、次のより良い感じに見えました。 純粋なIPデータベースをダウンロードし 、qqwry.datは、サイトのディレクトリに解凍します
# wget http://6.scdx3.crsky.com/201307/qqwry0715.zip
    # unzip qqwry0715.zip
    # mv ip/qqwry.dat /data/site/test.ttlsa.com/qqwry.dat
    IPアドレスの転送エリアPHPのクラス名を作成: ConvertIpNew.phpを
<?php
        class cls_ipAddress{
            private $fp;
            private $firstip;
            private $lastip;
            private $totalip;

            public function __construct($filename="qqwry.dat"){
                $this->fp=0;
                if(($this->fp=@fopen($filename,"rb"))!==false){
                    $this->firstip=$this->getlong();
                    $this->lastip=$this->getlong();
                    $this->totalip=($this->lastip-$this->firstip)/7;
                    register_shutdown_function(array(&$this,"__destruct"));
                }
            }

            public function __destruct(){
                if($this->fp){
                    @fclose($this->fp);
                }
                $this->fp=0;
            }

            private function getlong(){
                $result=unpack("Vlong",fread($this->fp,4));
                return $result["long"];
            }

            private function getlong3(){
                $result=unpack("Vlong",fread($this->fp,3).chr(0));
                return $result["long"];
            }

            private function packip($ip){
                return pack("N",intval(ip2long($ip)));
            }

            private function getstring($data=""){
                $char=fread($this->fp,1);
                while(ord($char)>0){
                    $data.=$char;
                    $char=fread($this->fp,1);
                }
                return $data;
            }

            private function getarea(){
                $byte=fread($this->fp,1);
                switch(ord($byte)){
                case 0:
                    $operators="";
                break;
                case 1:
                case 2:
                    fseek($this->fp,$this->getlong3());
                    $operators=$this->getstring();
                break;
                default:
                    $operators=$this->getstring($byte);
                break;}
                return $operators;
            }

            public function getlocation($ip){
                if(!$this->fp){return null;}
                $location["ip"]=gethostbyname($ip);
                $ip=$this->packip($location["ip"]);
                $l=0;
                $u=$this->totalip;
                $findip=$this->lastip;
                while($l<=$u){
                    $i=floor(($l+$u)/2);
                    fseek($this->fp,$this->firstip+$i*7);
                    $startip=strrev(fread($this->fp,4));
                    if($ip<$startip){
                        $u=$i-1;
                    }else{
                        fseek($this->fp,$this->getlong3());
                        $endip=strrev(fread($this->fp,4));
                        if($ip>$endip){
                            $l=$i+1;
                        }else{
                            $findip=$this->firstip+$i*7;
                            break;
                        }
                    }
                }
                fseek($this->fp,$findip);
                $location["startip"]=long2ip($this->getlong());
                $offset=$this->getlong3();
                fseek($this->fp,$offset);
                $location["endip"]=long2ip($this->getlong());
                $byte=fread($this->fp,1);
                switch(ord($byte)){
                case 1:
                    $countryOffset=$this->getlong3();
                    fseek($this->fp,$countryOffset);
                    $byte=fread($this->fp,1);
                    switch(ord($byte)){
                    case 2:
                        fseek($this->fp,$this->getlong3());
                        $location["area"]=$this->getstring();
                        fseek($this->fp,$countryOffset+4);
                        $location["operators"]=$this->getarea();
                    break;
                    default:
                        $location["area"]=$this->getstring($byte);
                        $location["operators"]=$this->getarea();
                    break;}
                break;
                case 2:
                    fseek($this->fp,$this->getlong3());
                    $location["area"]=$this->getstring();
                    fseek($this->fp,$offset+8);
                    $location["operators"]=$this->getarea();
                break;
                default:
                    $location["area"]=$this->getstring($byte);
                    $location["operators"]=$this->getarea();
                break;}
                if($location["area"]=="CZ88.NET"){
                    $location["area"]="未知";
                }
                if($location["operators"]=="CZ88.NET"){
                    $location["operators"]="未知";
                }
                return $location;
            }
        }
?>
テストファイルgetArea.php
<?
        $username="ttlsa网友";
        $ip='120.33.31.22';
        if(!preg_match("/^[\d]+\.[\d]+\.[\d]+\.[\d]+$/isU",$ip)){
                $username = 'IP地址错误';
        }else{
                require_once './ConvertIpNew.php';
                $setip=new cls_ipAddress("./qqwry.dat");
                $location=$setip->getlocation($ip);
                $str=$location['area'];
                $str=iconv("gb2312", "utf-8//IGNORE",$str); //这边纯真IP数据库获取到的gb2312格式的文字,要先转成UTF8
                preg_match_all('/(.*?)省(.*?)市/',$str,$userLocation);
                if (is_array($userLocation)) {
                        $province = $userLocation[1][0];
                        $city = $userLocation[1][0];
                }
                $username = "ttlsa" . $province."省". $city . '市网友';
        }
}
?>
次の図は、我々はttlsa福州のネチズンを見ることができます。[キャプションID = "attachment_1767"揃える = "aligncenter"幅= "623"] ユーザー名とIPアドレスの転送エリア名を使ってPHP +純粋なIPデータベース 、PHP +ユーザ名と地域名を転送する、純粋なIPデータベースのIPアドレスを使用して、[/キャプション]ソースを示してくださいます。http://www.ttlsaを。 COM / HTML / 1766.html  

ます。https://my.oschina.net/766/blog/211337で再現

おすすめ

転載: blog.csdn.net/weixin_34162401/article/details/91547910