Habe selbst kürzlich eine Lösung in PHP benötigt. Das Interface stellt genau eine Methode zur Verfügung: getCountryByHostname
PHP
<?php
// namespace App\Lib\GeoIP;
interface GeoIPInterface
{
public static function getCountryByHostname($hostname);
}
Woher genau man die Daten holt bleibt dann jedem selbst überlassen, hier allerdings 2 Möglichkeiten.
Mit einer lokalen GeoIP-Datenbank und der GeoIP-Extension
PHP
<?php
//namespace App\Lib\GeoIP;
class LocalDatabase implements GeoIPInterface
{
public static function getCountryByHostname($hostname)
{
if (!function_exists("geoip_db_avail")) {
throw new \Exception("GeoIP module not found");
}
if (!geoip_db_avail(GEOIP_COUNTRY_EDITION)) {
throw new \Exception("No geoip database for GEOIP_COUNTRY_EDITION found");
}
if (false === $code = @geoip_country_code_by_name($hostname)) {
throw new \Exception("Invalid or unknown hostname ({$hostname})");
}
return $code;
}
}
Alles anzeigen
Über die Seite freegeoip.net
PHP
<?php
//namespace App\Lib\GeoIP;
class FreeGeoIPNet implements GeoIPInterface
{
const REQUEST_URL = "http://freegeoip.net/";
public static function getCountryByHostname($hostname)
{
if (false === $response = file_get_contents(self::REQUEST_URL . "json/{$hostname}")) {
throw new \Exception("Unable to fetch data from " . self::REQUEST_URL);
}
if (null === $decoded = json_decode($response)) {
throw new \Exception("Invalid or unknown hostname ({$hostname})");
}
return $decoded->country_code;
}
}
Alles anzeigen
Das PHP-Script passend die Include muss allerdings noch erstellt werden.