The following is a modified version of a snippet I found that uses //ipinfodb.com/ip_locator.php to get its information. Keep in mind, you can also apply for an API key with them and use the API directly to get the information supplied as you see fit.
Snippet
function detect_location[$ip=NULL, $asArray=FALSE] {
if [empty[$ip]] {
if [!empty[$_SERVER['HTTP_CLIENT_IP']]] { $ip = $_SERVER['HTTP_CLIENT_IP']; }
elseif [!empty[$_SERVER['HTTP_X_FORWARDED_FOR']]] { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; }
else { $ip = $_SERVER['REMOTE_ADDR']; }
}
elseif [!is_string[$ip] || strlen[$ip] < 1 || $ip == '127.0.0.1' || $ip == 'localhost'] {
$ip = '8.8.8.8';
}
$url = '//ipinfodb.com/ip_locator.php?ip=' . urlencode[$ip];
$i = 0; $content; $curl_info;
while [empty[$content] && $i < 5] {
$ch = curl_init[];
$curl_opt = array[
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $url,
CURLOPT_TIMEOUT => 1,
CURLOPT_REFERER => '//' . $_SERVER['HTTP_HOST'],
];
if [isset[$_SERVER['HTTP_USER_AGENT']]] $curl_opt[CURLOPT_USERAGENT] = $_SERVER['HTTP_USER_AGENT'];
curl_setopt_array[$ch, $curl_opt];
$content = curl_exec[$ch];
if [!is_null[$curl_info]] $curl_info = curl_getinfo[$ch];
curl_close[$ch];
}
$araResp = array[];
if [preg_match['{City : [[^