PHPは純真IPデータベースを利用して、現地でIPアドレス情報の照会を実現します.

7350 ワード

PHP交流群:294088839、
準備:
ローカルIPアドレスデータベースを提案します.http://www.cz88.net/このウェブサイトは純粋なIPデータベースをダウンロードして、インストールが完了したら、インストールディレクトリにQQWry.datファイルを取り出してください.これは私達が欲しいIPデータベースです.カタログの下に置いてください.
正面のこのIPアドレスは処理の種類を問合せします.
 
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;
    }
 
    /**
     *          
     *
     * @access private
     * @return int
     */
    private function getlong()
    {
        //    little-endian   4          
        $result = unpack('Vlong', fread($this->fp, 4));
        return $result['long'];
    }
 
    /**
     *      3        
     *
     * @access private
     * @return int
     */
    private function getlong3()
    {
        //    little-endian   3          
        $result = unpack('Vlong', fread($this->fp, 3) . chr(0));
        return $result['long'];
    }
 
    /**
     *            IP  
     *
     * @access private
     * @param string $ip
     * @return string
     */
    private function packip($ip)
    {
        //  IP         ,   PHP5 ,IP    ,   False,
        //   intval Flase     -1,     big-endian      
        return pack('N', intval(ip2long($ip)));
    }
 
    /**
     *         
     *
     * @access private
     * @param string $data
     * @return string
     */
    private function getstring($data = "")
    {
        $char = fread($this->fp, 1);
        while (ord($char) > 0) { //      C    ,   
            $data .= $char; //                 
            $char = fread($this->fp, 1);
        }
        return iconv('gbk', 'utf-8', $data);
    }
 
    /**
     *       
     *
     * @access private
     * @return string
     */
    private function getarea()
    {
        $byte = fread($this->fp, 1); //     
        switch (ord($byte)) {
            case 0: //       
                $area = "";
                break;
            case 1:
            case 2: //      1 2,          
                fseek($this->fp, $this->getlong3());
                $area = $this->getstring();
                break;
            default: //   ,            
                $area = $this->getstring($byte);
                break;
        }
        return $area;
    }
 
    /**
     *      IP              
     *
     * @access public
     * @param string $ip
     * @return array
     */
    public function getlocation($ip)
    {
        if (!$this->fp)
            return null; //              ,      
        $location['ip'] = gethostbyname($ip); //          IP  
        $ip = $this->packip($location['ip']); //     IP         IP  
        //     IP       255.255.255.255
        //     
        $l = 0; //       
        $u = $this->totalip; //       
        $findip = $this->lastip; //              IP  (QQWry.Dat     )
        while ($l <= $u) { //           ,    
            $i = floor(($l + $u) / 2); //         
            fseek($this->fp, $this->firstip + $i * 7);
            $beginip = strrev(fread($this->fp, 4)); //          IP  
            // strrev          little-endian   IP     big-endian   
            //       ,    。
            if ($ip < $beginip) { //    IP         IP   
                $u = $i - 1; //                 
            } else {
                fseek($this->fp, $this->getlong3());
                $endip = strrev(fread($this->fp, 4)); //          IP  
                if ($ip > $endip) { //    IP         IP   
                    $l = $i + 1; //                 
                } else { //    IP      IP    
                    $findip = $this->firstip + $i * 7;
                    break; //        ,    
                }
            }
        }
        //      IP      
        fseek($this->fp, $findip);
        $location['beginip'] = long2ip($this->getlong()); //   IP         
        $offset = $this->getlong3();
        fseek($this->fp, $offset);
        $location['endip'] = long2ip($this->getlong()); //   IP         
        $byte = fread($this->fp, 1); //     
        switch (ord($byte)) {
            case 1: //      1,                
                $countryOffset = $this->getlong3(); //      
                fseek($this->fp, $countryOffset);
                $byte = fread($this->fp, 1); //     
                switch (ord($byte)) {
                    case 2: //      2,           
                        fseek($this->fp, $this->getlong3());
                        $location['country'] = $this->getstring();
                        fseek($this->fp, $countryOffset + 4);
                        $location['area'] = $this->getarea();
                        break;
                    default: //   ,            
                        $location['country'] = $this->getstring($byte);
                        $location['area'] = $this->getarea();
                        break;
                }
                break;
            case 2: //      2,          
                fseek($this->fp, $this->getlong3());
                $location['country'] = $this->getstring();
                fseek($this->fp, $offset + 8);
                $location['area'] = $this->getarea();
                break;
            default: //   ,            
                $location['country'] = $this->getstring($byte);
                $location['area'] = $this->getarea();
                break;
        }
        if ($location['country'] == " CZ88.NET") { // CZ88.NET        
            $location['country'] = "  ";
        }
        if ($location['area'] == " CZ88.NET") {
            $location['area'] = "";
        }
        return $location;
    }
}

呼び出し方法:
  include'Ip Location.php'  echo「
";   
$ip = "180.76.6.130";   
$iplocation = new IpLocation();   
$location = $iplocation->getlocation($ip);   
print_r($location);   
 

:https://blog.csdn.net/myweishanli/article/details/45098693