Stadt und Land mittels GeoIP ermitteln

So erstmal ein paar Infos zu der gerade von Dir verwendeten IP

Nachdem Piwik jetzt eine Erweiterung hat, um mittels der DB von Maxmind eine genauere Auswertung der Herkunft von Website-Besuchern zu ermoeglichen, habe ich mich entschlossen, die kostenlose Version auch auf allen unserer Server bereitzustellen. Um es vorweg zu sagen: Die kostenlose Version ist nach Herstellerangaben bei weitem nicht so genau wie die kommerzielle Version. Zumindest was die Laenderzuordnung betrifft aber kaum schlechter. Ich habe einen Vergleich ueber die letzten 100.000 Besucher gemacht und nur bei 4 (vier!) gab es eine Abweichung. Das kann aber schlicht auch an einer Abweichung der Zugordnung ueber die letzten beiden Monate gelegen haben. Wer also nicht die knapp 400 Dollar jeden Monat investieren moechte, kann gern die GEOLite-Version nutzen. Bitte aber die Nutzungsbedingungen beachten. Wir stellen die DB nur bereit, wir implementieren Sie nicht, auch wenn wir Euch dabei natuerlich wie immer gern behilflich sind.

BTW: Wer ueber uns die Kaufversion installiert hat, kann die natuerlich auch weiterhin nutzen! An der Implementierung aendert sich nichts! Probleme gab es lediglich mit dem WordPress-Plugin „Content by Country“, weil das offenbar die gleichen Variablen im GLOBAL-Scope verwendet 🙁 Wer davon betroffen war, hat ja schon eine Info vom Support bekommen.

So nun aber eeendlich zur Implementierung! 😉

In einem PHP-Datei koennt Ihr einfach folgenden Code ausprobieren:

print_r(geoip_record_by_name($_SERVER[REMOTE_ADDR]));

Das sollte jetzt die Daten zu Eurem aktuell ermittelten Standort auswerfen.

Natuerlich leasst sich da oben auch jede andere IP einwerfen. Also zum Beispiel die ‚217.79.215.248‘ von www.bundesregierung.de und das ergibt dann

Array
(   [continent_code] => EU
    [country_code] => DE
    [country_code3] => DEU
    [country_name] => Germany
    [region] => 07
    [city] => Düsseldorf
    [postal_code] => 
    [latitude] => 51.216702
    [longitude] => 6.766700
    [dma_code] => 0
    [area_code] => 0
)

Okay, das war jetzt etwas geflunkert. Nicht das mit der Stadt! Die Angaben sind richtig! Natuerlich sitzt der Provider des Webserver der Bundesregierung in Ddorf und nicht die Regierung selber. Obwohl? 😉 Nein das Ergebnis-Array selbst war gemeint. Die Daten stammen naemlich aus der kommerziellen Version. Die freie liefert leider keine Angaben. Was aber fuer die meisten Zwecke wohl unerheblich sein sollte, weil Server halt selten surfen.

Wie laesst sich das nun einfach einbauen? Nehmen wir an, Ihr wollt allen Besucher aus DACH-Land auf Deutsch und den Rest der Welt auf Englisch begruessen, dann koennte Euer Code etwa so aussehen.


switch(geoip_country_code_by_name($_SERVER[REMOTE_ADDR])){
case 'DE': echo 'Hallo Welt'; break;
case 'AT': echo 'Hallo Welt'; break;
case 'CH': echo 'Hallo Welt'; break;
default: echo 'Hello world';
}

Eine Liste aller moglichen GeoIP-Funktionen von PHP gibt es uebrigens unter http://de3.php.net/manual/de/ref.geoip.php.

Zum Schluss noch ein kleiner Hinweis fuer alle, die ihre eigenen Testserver administrieren. Die Installation ist recht einfach.

1.) libGeoIP-devel entrechend Eurer Distribution installieren (Bei OpenSuse zum Beispiel mit zypper install libGeoIP-devel)
2.) PECL-Erweiterung installieren (zum Beispiel mit /opt/3uu/php/bin/pecl install geoip oder eben entsprechend dem Ort von pecl)
3.) php.ini anpassen (joe /opt/3uu/php.ini und da dann eintragen extension=geoip.so)

Nach einen Neustart des Webservers sollte Euch phpinfo() jetzt einen Abschnitt „geoip“ zeigen. Nach diesen eher seltenen (einmaligen) Vorarbeiten, brauchen wir nun noch die DB selbst.


cd /usr/local/src
wget -N http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gunzip GeoLiteCity.dat.gz
mv GeoLiteCity.dat /var/lib/GeoIP/GeoIPCity.dat

Die DB wird von Maxmind derzeit wohl immer am ersten Dienstag im Monat updated. Ihr koennt wget aber mit dem Parameter „-N“ aufrufen. Dann wird Euch die neue Datei nur auf den Server geschaufelt, wenn sie auch wirklich ein neueres Datum hat. Falls danach die GeoIP-Funktionen noch immer kein Ergebnis liefern, schaut am besten mal nach, welche Versionen verfuegbar sind bzw. wo die Erweiterung die DBs erwartet. Das geht ganz einfach mit print_r(geoip_db_get_all_info());.

Dieser Beitrag wurde unter Allgemein, Systemadministration veröffentlicht. Setze ein Lesezeichen auf den Permalink.

Eine Antwort zu Stadt und Land mittels GeoIP ermitteln

  1. admin3uu sagt:

    Hinweise zur Implementierung mit PHP7 gibt es jetzt unter https://datenverwurstungszentrale.com/geoip-mit-php7-851.htm

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert