Andy's Blog » » GeoIP

GeoIP

GeoIP数据库下载地址:
http://www.maxmind.com/download/geoip/database/

GeoIP的PHP类

class_geoip.php
<?php
 
/**
* GeoIPCountryWhois Locator
*
* This file locates the remote's country using it's IP, parsed in a CSV values
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
*
http://www.php.net/license/3_0.txt.  If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to
[email protected] so we can mail you a copy immediately.
*
*
@category   Localization
*
@package    geoip
*
@author     Marius Zadara <[email protected]>
*
@copyright (C) Marius Zadara <[email protected]>
*
@license    http://www.php.net/license/3_0.txt  PHP License 3.0
*
@version    1.0
*
@since      File available since Release 1.0
*/

 
 
 
class GeoIP
{
    
var $_path;
 
 
    
/**
    * Boolean found
    *
    *
@since 1.0
    *
@var boolean
    */

    
var $_found            = false;
 
    
/**
    * Starting address of the class
    *
    *
@return void
    *
@var boolean
    */

    
var $_start_ip         = false;
 
    
/**
    * Ending address of the class
    *
    *
@return void
    *
@var boolean
    */

    
var $_end_ip         = false;
 
    
/**
    * Country code
    *
    *
@return void
    *
@var boolean
    */

    
var $_country_code     = false;
 
    
/**
    * Country name
    *
    *
@return void
    *
@var boolean
    */

    
var $_country_name     = false;
 
    
/**
    * CSV values
    *
    *
@return void
    *
@var boolean
    */

    
var $_data            = array();
 
    
/**
    * Long representation of the IP
    *
    *
@return void
    *
@var boolean
    */

    
var $_longip        = 0;
 
    
/**
    * Class constructor
    *
    *
@return void
    *
@access public
    *
@static
    * @since 1.0
    */

    
function GeoIP()
    
{
        
$filename = "GeoIPCountryWhois.gz";
        
$this->_data = gzfile($filename);
    
}
 
    
/**
    * IP address conversion: A.B.C.D -> log
    *
    *
@param string $string IP Address: A.B.C.D
    *
@return long
    *
@access private
    *
@static
    * @since 1.0
    */

    
private function convert2number($string)
    
{
        
$pattern= "\"([0-9]+)\"";
        
if (ereg($pattern, $string, $regs))
            
return (int)$regs[1];
    
}
 
    
/**
    * IP searching
    *
    *
@param string $beg Starting index
    *
@param string $end Ending index
    *
@return long/bool
    *
@access private
    *
@static
    * @since 1.0
    */

    
private function search($beg, $end)
    
{
        
/**
        This is the main search functions.
 
        It uses the DIVIDE-ET-IMPERA paradigm to find the specified IP in the data array.
        Each data in the array looks like:
            "IP_1","IP_2","LONG_IP_1","LONG_IP_2","COUNTRY_CODE","COUNTRY_NAME"
 
        IP is belonging to COUNTRY_NAME if complies with the formula:
            LONG_IP_1 <= LONG_IP <= LONG_IP_2
 
        The function returns either:
            - the pozition in the array IF FOUND
            - false, IF NOT FOUND
        */

 
        
$mid = ceil(($end + $beg) / 2);
 
 
        
$arr_beg = array();
        
$arr_mid = array();
        
$arr_end = array();
 
        
$arr_beg = explode(",", $this->_data[$beg]);
        
$arr_mid = explode(",", $this->_data[$mid]);
        
$arr_end = explode(",", $this->_data[$end]);
 
 
        
$arr_beg[2] = str_replace('"', '', $arr_beg[2]);
        
$arr_beg[3] = str_replace('"', '', $arr_beg[3]);
 
        
$arr_mid[2] = str_replace('"', '', $arr_mid[2]);
        
$arr_mid[3] = str_replace('"', '', $arr_mid[3]);
 
        
$arr_end[2] = str_replace('"', '', $arr_end[2]);
        
$arr_end[3] = str_replace('"', '', $arr_end[3]);
 
 
 
 
        
if (($this->_longip >= $arr_beg[2]) && ($this->_longip <= $arr_beg[3]))
        
{
            
unset($arr_beg); unset($arr_mid); unset($arr_end);
            
return $beg;
        
}
        
else
            
if (($this->_longip >= $arr_mid[2]) && ($this->_longip <= $arr_mid[3]))
            
{
                
unset($arr_beg); unset($arr_mid); unset($arr_end);
                
return $mid;
            
}
            
else
                
if (($this->_longip >= $arr_end[2]) && ($this->_longip <= $arr_end[3]))
                
{
                    
unset($arr_beg); unset($arr_mid); unset($arr_end);
                    
return $end;
 
                
}
                
else
                    
if (($this->_longip > $arr_beg[3]) && ($this->_longip < $arr_mid[2]))
                    
{
                        
unset($arr_beg); unset($arr_mid); unset($arr_end);
                        
return $this->search($beg, $mid);
                    
}
                    
else
                        
if (($this->_longip > $arr_mid[3]) && ($this->_longip < $arr_end[2]))
                        
{
                            
unset($arr_beg); unset($arr_mid); unset($arr_end);
                            
return $this->search($mid, $end);
                        
}
                        
else
                        
{
                            
unset($arr_beg); unset($arr_mid); unset($arr_end);
                            
return false;
                        
}
    
}
 
 
    
/**
    * IP conversion
    *
    *
@param string $address IP address in the A.B.C.D format
    *
@return long
    *
@access private
    *
@static
    * @since 1.0
    */

    
private function IpAddress2IpNumber($address)
    
{
        
$pattern = "([0-9]+).([0-9]+).([0-9]+).([0-9]+)";
 
        
if (ereg($pattern, $address, $regs))
            
return $number = $regs[1] * 256 * 256 * 256 + $regs[2] * 256 * 256 + $regs[3] * 256 + $regs[4];
        
else
            
return false;
    
}
 
 
    
/**
    * MAIN SEARCH
    *
    *
@param string $ip The IP Searched
    *
@return void
    *
@access private
    *
@static
    * @since 1.0
    */

    
public function search_ip($ip)
    
{
        
// if not localhost ...
        
if (($ip != "127.0.0.1") && ($ip != "0.0.0.1"))
        
{
            
$this->_longip = $this->IpAddress2IpNumber($ip);
 
            
if ($this->_longip !== false)
                
$poz = $this->search(0, sizeof($this->_data)-1);
 
            
if ($poz !== false)
            
{
                
$info = explode(",", $this->_data[$poz]);
 
                
$this->_found            = true;
                
$this->_start_ip         = str_replace('"', '', $info[0]);
                
$this->_end_ip             = str_replace('"', '', $info[1]);
                
$this->_country_code     = str_replace('"', '', $info[4]);
                
$this->_country_name     = str_replace('"', '', $info[5]);
            
}
        
}
    
}
 
    
/**
    * IP Class start
    *
    *
@return string
    *
@access public
    *
@static
    * @since 1.0
    */

    
public function getStartIp()        {return $this->_start_ip;}
 
    
/**
    * IP Class end
    *
    *
@return string
    *
@access public
    *
@static
    * @since 1.0
    */

    
public function getEndIp()            {return $this->_end_ip;}
 
    
/**
    * IP Country Code
    *
    *
@return string
    *
@access public
    *
@static
    * @since 1.0
    */

 
    
public function getCountryCode()    {return $this->_country_code;}
 
    
/**
    * IP Country name
    *
    *
@return string
    *
@access public
    *
@static
    * @since 1.0
    */

    
public function getCountryName()    {return $this->_country_name;}
 
    
/**
    * IP Found flag
    *
    *
@return boolean
    *
@access public
    *
@static
    * @since 1.0
    */

    
public function found()                {return $this->_found;}
 
 
    
/**
    * Class unset
    *
    *
@return void
    *
@access public
    *
@static
    * @since 1.0
    */

    
public function destroy()
    
{
        
unset($this->_found);
        
unset($this->_start_ip);
        
unset($this->_end_ip);
        
unset($this->_country_code);
        
unset($this->_country_name);
        
unset($this->_data);
        
unset($this);
    
}
}
 
 
?>

GeoIP类使用方法:

<?php
    
require_once("classes_geoip.php");
    
$objGeoIP = new GeoIP();
    
$objGeoIP->search_ip($_SERVER['REMOTE_ADDR']);
    
if ($objGeoIP->found())
    
{
        
echo "Country Code: "     . $objGeoIP->getCountryCode()     . "<br/>";
        
echo "Country Name: "     . $objGeoIP->getCountryName()     . "<br/>";
        
echo "IP Class Start: " . $objGeoIP->getStartIp()         . "<br/>";
        
echo "IP Class End: "     . $objGeoIP->getEndIp()         . "<br/>";
    
}
    
else
        
echo "NOT FOUND!";
?>

Incoming search terms:

Tags: GeoIP, IP反查, IP段

本文地址: http://www.21andy.com/new/20080208/861.html