/ lib / geoip2.php
geoip2.php
  1  <?php
  2  
  3  //require_once('MaxMind-DB-Reader/autoload.php');
  4  
  5  final class GeoIP2 {
  6    private static
  7      $db_file_country    = '/usr/local/share/GeoIP2/GeoLite2-City.mmdb',
  8      $db_file_asn        = '/usr/local/share/GeoIP2/GeoLite2-ASN.mmdb'
  9    ;
 10    
 11    private static
 12      $mmdb_country       = null,
 13      $mmdb_asn           = null
 14    ;
 15    
 16    private function __construct() {}
 17    
 18    private static function load_db($file) {
 19      try {
 20        return new MaxMind\Db\Reader($file);
 21      } catch (Exception $e) {
 22        return false;
 23      }
 24    }
 25    
 26    // geoip_record_by_name
 27    public static function get_country($ip) {
 28      if (!$ip) {
 29        return null;
 30      }
 31      
 32      if (self::$mmdb_country === null) {
 33        self::$mmdb_country = self::load_db(self::$db_file_country);
 34      }
 35      
 36      if (!self::$mmdb_country) {
 37        return null;
 38      }
 39      
 40      try {
 41        $entry = self::$mmdb_country->get($ip);
 42      } catch (Exception $e) {
 43        return null;
 44      }
 45      
 46      $data = array();
 47      
 48      // Continent
 49      if (isset($entry['continent']['code'])) {
 50        $data['continent_code'] = $entry['continent']['code'];
 51      }
 52      
 53      // Country
 54      if (isset($entry['country']['iso_code'])) {
 55        $data['country_code'] = $entry['country']['iso_code'];
 56        $data['country_name'] = $entry['country']['names']['en'];
 57        
 58        // State for US
 59        if ($data['country_code'] === 'US' && isset($entry['subdivisions'][0]['iso_code'])) {
 60          $data['state_code'] = $entry['subdivisions'][0]['iso_code'];
 61          $data['state_name'] = $entry['subdivisions'][0]['names']['en'];
 62        }
 63        // FIXME: subdivisions for UK during sport events
 64        else if ($data['country_code'] === 'GB' && isset($entry['subdivisions'][0]['iso_code'])) {
 65          $data['sub_code'] = $entry['subdivisions'][0]['iso_code'];
 66        }
 67      }
 68      
 69      if (isset($entry['city']['names']['en'])) {
 70        $data['city_name'] = $entry['city']['names']['en'];
 71      }
 72      
 73      if (empty($data)) {
 74        return null;
 75      }
 76      
 77      return $data;
 78    }
 79    
 80    public static function get_asn($ip) {
 81      if (!$ip) {
 82        return null;
 83      }
 84      
 85      if (self::$mmdb_asn === null) {
 86        self::$mmdb_asn = self::load_db(self::$db_file_asn);
 87      }
 88      
 89      if (!self::$mmdb_asn) {
 90        return null;
 91      }
 92      
 93      try {
 94        $entry = self::$mmdb_asn->get($ip);
 95      } catch (Exception $e) {
 96        return null;
 97      }
 98      
 99      $data = array();
100      
101      if (isset($entry['autonomous_system_number'])) {
102        $data['asn'] = $entry['autonomous_system_number'];
103      }
104      
105      if (isset($entry['autonomous_system_organization'])) {
106        $data['aso'] = $entry['autonomous_system_organization'];
107      }
108      
109      if (empty($data)) {
110        return null;
111      }
112      
113      return $data;
114    }
115  }