Wo ungefähr ist eine IP Adresse beheimatet? GeoIP in PHP
Manchmal möchte man wissen aus welchem Land oder welcher Region eine IP-Adresse kommt, und dafür gibt es bereits Lösungen die leicht zu benutzen sind. Als erstes schauen wir uns die Geo-IP-Datenbank von MaxMind an, die wir mit der PEAR-Klasse Net_GeoIP ansprechen. Wer nur das Land braucht der sollte sich die kostenlose GeoLite Country Datenbank anschauen, wenn die Stadt bzw. die Region benötigt wird wirft man einen Blick auf die GeoLite City Datenbank. Von beiden gibt es auch noch kostenpflichtige Versionen, die genauer und aktueller sind.
Das erste Beispiel zeigt die Verwendung der Länder-Datenbank:
<?php require_once "Net/GeoIP.php"; $geoip = Net_GeoIP::getInstance("GeoIP.dat"); $ipAddresses = array( '77.177.166.7', '41.135.69.4', '183.111.12.21', '202.127.1.88', '174.139.204.218', '192.121.32.239', ); foreach ($ipAddresses as $ipAddress) { echo $ipAddress.' '.$geoip->lookupCountryCode($ipAddress)."\n"; }
Die Ausgabe in diesem Fall sieht so aus:
77.177.166.7 DE 41.135.69.4 ZA 183.111.12.21 KR 202.127.1.88 CN 174.139.204.218 US 192.121.32.239 SE
Für die zweite Variante mit der City-Datenbank sieht das Script recht ähnlich aus:
<?php require_once "Net/GeoIP.php"; $geoip = Net_GeoIP::getInstance("GeoLiteCity.dat"); $ipAddresses = array( '77.177.166.7', '41.135.69.4', '183.111.12.21', '202.127.1.88', '174.139.204.218', '192.121.32.239', ); foreach ($ipAddresses as $ipAddress) { $location = $geoip->lookupLocation($ipAddress); echo 'IP Address: '.$ipAddress."\n". 'CountryCode: '.$location->countryCode."\n". 'CountryName: '.$location->countryName."\n". 'City: '.$location->city."\n". 'PostalCode: '.$location->postalCode."\n". 'Region: '. $location->region."\n". 'Lat/Lan: '.$location->latitude."/".$location->longitude."\n\n"; }
Die Ausgabe:
IP Address: 77.177.166.7 CountryCode: DE CountryName: Germany City: Spenge PostalCode: Region: 07 Lat/Lan: 52.1333/8.4833 IP Address: 41.135.69.4 CountryCode: ZA CountryName: South Africa City: Port Elizabeth PostalCode: Region: 05 Lat/Lan: -33.9667/25.5833 IP Address: 183.111.12.21 CountryCode: KR CountryName: Korea, Republic of City: Seoul PostalCode: Region: 11 Lat/Lan: 37.5664/126.9997 IP Address: 202.127.1.88 CountryCode: CN CountryName: China City: Beijing PostalCode: Region: 22 Lat/Lan: 39.9289/116.3883 IP Address: 174.139.204.218 CountryCode: US CountryName: United States City: Spartanburg PostalCode: 29302 Region: SC Lat/Lan: 34.8822/-81.8511 IP Address: 192.121.32.239 CountryCode: SE CountryName: Sweden City: PostalCode: Region: Lat/Lan: 62/15
Des weiteren gibt es noch eine Region-Datenbank und eine Organisation/ISP-Datenbank, die mit den entsprechenden Methoden lookupRegion() und lookupOrg() in Net_GeoIP ausgelesen werden können.
Alternativ gibt es die Möglichkeit die PECL geoip PHP Extension zu nutzen, die auch die Datenbanken von MaxMind nutzt, das Manual befindet sich auf php.net.
Webserver können auch Geo-Informationen nutzen, beispielsweise Apache GeoIP API und nginx HttpGeoIP Module. Damit ist es super einfach Zugriffe aus bestimmten Ländern zu blocken oder anderen Inhalt zu präsentieren, oder auch die Geo-Information als Parameter an den Backend-Server zu liefern (im Fall von nginx als Reverse Proxy).
Es gibt auch einige Webservices die Geo-Informationen zu IP-Adressen bieten, von denen bekommt man via REST entweder JSON, XML oder CSV. Einige Beispiele:
http://www.geobytes.com/iplocator.htm
http://ipinfodb.com/ip_location_api_json.php
https://simplegeo.com/docs/clients-code-libraries/php
http://www.hostip.info/use.html
Wenn diese Dienste eine bessere Datenbank bieten lohnt sich evtl. ein Blick, aber da man auf die Verfügbarkeit angewiesen ist und Webservices auch langsamer sind als lokale Lookups ist die Verwendung problematisch.
Ähnliche Artikel: