Land aus IP-Adresse ermitteln in PHP

Für viele Anwendungen die Geocoding benötigen, gibt es für PHP die Library geocoder-php.

Hier zeige ich euch, wie man diese Bibliothek benutzt um aus der IP-Adresse eines Besuchers das Land zu ermitteln, von welchem er auf eure Seite zugreift. Das könnte man z.B. benutzen, um die Sprache der Webseite schon vorab entsprechend einzustellen oder dem Besucher gleich länderspezifische Informationen als erstes anzuzeigen.

Natürlich ist diese Zuordnung nicht immer 100% richtig, der Besucher könnte z.B. über einen Proxy eure Seite ansurfen. Die Library kann auch versuchen, Adressen zur IP-Adresse zu ermitteln, welche natürlich immer nur Schätzungen sein können. Aber zumindest hat man in den meisten Fällen einen richtigen Startpunkt, und man kann dem Besucher immer noch anbieten, die Informationen zu ändern.

Die Geocoder-PHP Library ist sehr umfangreich und ermöglicht die Nutzung verschiedener Provider. Ein Provider hat z.B. eine Datenbank mit IP- zu Geo-Adressen.

Wir wollen für unsere Zwecke das freegeoip-Projekt als Provider verwenden. Dabei handelt es sich um ein Gemeinschaftsprojekt, welches die kostenlose Abfrage von 15000 IP-Adressen pro Stunde erlaubt. Da das Projekt auf Finanzierung angewiesen ist, kann man bei erfolgreicher Anwendung auch einen kleinen Betrag spenden…

Um also die geocoder-php-Library in unserem Projekt zu verwenden, installiert man sie am Besten mittels composer:

$ composer require willdurand/geocoder

Danach kann man für eine IP-Adresse die Geodaten ermitteln:

// IP-Adresse z.B. vom Webseiten-Besucher
$ip = $_SERVER['REMOTE_ADDR'];

$adapter = new \Ivory\HttpAdapter\CurlHttpAdapter();
$geocoder = new \Geocoder\Provider\FreeGeoIp($adapter);
try {
   $result = $geocoder->geocode($ip)->first();
   $country = $result->getCountry();               
   echo 'Land ermittelt: ' . $country->getName() . ' Länder-Code: ' . $country->getCode();
} catch (Exception $e) {
   echo 'Fehler: Land konnte nicht ermittelt werden: ' . $e->getMessage();
}