Aquí hay uno que yo uso. Si no obtiene una variable GET, usa la dirección remota del usuario.
<?php
if(!empty($_GET['ip'])){
if(preg_match('!^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$!',$_GET['ip'])){
$ip_address=$_GET['ip'];
} else {
print ("invalid ip address");
}
} else {
$ip_address=$_SERVER['REMOTE_ADDR'];
}
$test = file_get_contents('http://www.geoplugin.net/php.gp?ip='.$ip_address);
$test = unserialize($test);
print "<html><pre>";
print_r ($test);
print "</pre></html>";
?>