geoip2-test.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 }