Я недавно реализовал геолокацию с GeoIP (пакет PEAR). Это не очень точно, но дает страну в порядке, регион / штат в порядке, а главный ближайший город почти всегда прав.
После установки пакета вам необходимо загрузить последний файл данных с maxmind , и его можно использовать так же просто, как это:
require_once "Net/GeoIP.php";
$geoloc = Net_GeoIP::getInstance('/var/www/GeoIP.dat');
try{
$countryCode = $geoloc->lookupCountryCode($_SERVER['REMOTE_ADDR']);
}
catch(Exception $e) {}