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.
Die Klassen von Maxmind sind übrigens arschlahm. Mit der DB fährt man besser, wenn man Leistung braucht. Allerdings muss man die Indizes gut setzen und richtig abfragen. Die Beispiele von Maxmind sind dafür auch eher suboptimal.
Oliver
23 Nov 11 at 11:09
Schöner Beitag.
Der Link wäre ggf. auch interessant:
http://de.php.net/geoip
ROMOPAT
23 Nov 11 at 16:11
Einige davon kannte ich noch garnicht 😉
Falls jemand eine PHP5.3 Geocoder Library sucht kann ich nur diese empfehlen.
https://github.com/willdurand/Geocoder
Markus Bachmann
23 Nov 11 at 16:12
[…] Wo ungefähr ist eine IP Adresse beheimatet? GeoIP in PHP | PHP Gangsta – Der PHP Blog mit… [Tags: geoip php ] […]
Meine Lesezeichen vom 14 November bis 23 November : Casa Rock!
23 Nov 11 at 22:16
erinnert mich an das Projekt hier https://github.com/bobmajdakjr/php-geoipo/
Flyingmana
24 Nov 11 at 23:46
[…] Wo ungefähr ist eine IP Adresse beheimatet? GeoIP in PHP | PHP Gangsta – Der PHP Blog mit Pra… […]
Linkhub – Woche 47-2011
28 Nov 11 at 16:00
[…] hiermit auf folgende Beiträge: http://www.dhmedia.com.au/blog/configuring-geoip-extensions-php und https://www.phpgangsta.de/wo-ungefahr-ist-eine-ip-adresse-beheimatet-geoip-in-php welche dieses Thema sehr gut […]
GeoIP Datenbank auf den neusten Stand halten
5 Mrz 13 at 15:25
ich brauch eine seite wo ich mit einer map eine ip adresse rausfinden kann
AffeSuperIntelligent
8 Apr 13 at 10:04