PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Wo ungefähr ist eine IP Adresse beheimatet? GeoIP in PHP

with 8 comments

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://freegeoip.net

http://www.geobytes.com/iplocator.htm

http://www.geoio.com/

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.

Written by Michael Kliewe

November 23rd, 2011 at 10:11 am

8 Responses to 'Wo ungefähr ist eine IP Adresse beheimatet? GeoIP in PHP'

Subscribe to comments with RSS or TrackBack to 'Wo ungefähr ist eine IP Adresse beheimatet? GeoIP in PHP'.

  1. 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

  2. Schöner Beitag.

    Der Link wäre ggf. auch interessant:
    http://de.php.net/geoip

    ROMOPAT

    23 Nov 11 at 16:11

  3. 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

  4. […] Wo ungefähr ist eine IP Adresse beheimatet? GeoIP in PHP | PHP Gangsta – Der PHP Blog mit… [Tags: geoip php ] […]

  5. erinnert mich an das Projekt hier https://github.com/bobmajdakjr/php-geoipo/

    Flyingmana

    24 Nov 11 at 23:46

  6. […] Wo ungefähr ist eine IP Adresse beheimatet? GeoIP in PHP | PHP Gangsta – Der PHP Blog mit Pra… […]

  7. ich brauch eine seite wo ich mit einer map eine ip adresse rausfinden kann

Leave a Reply

You can add images to your comment by clicking here.