Вы, вероятно, захотите использовать API GeoLocation. 
ipinfo.io предоставляет простой интерфейс возврата простого текста, но, как и многие API геолокации, он требует платных версий сервиса, если вы превышаете определенные ограничения (например, в случае ipinfo.io вам требуется более 1000 запросов в день или SSL),
Используя не-JSON-версию ipinfo.io в качестве примера, ваш PHP-код может выглядеть следующим образом:
<?php 
    // This turns on error display without messing with php.ini
    // Delete the following two lines in production
    ini_set('display_errors',1); 
    error_reporting(E_ALL);
    // We avoid using $_SERVER['REMOTE_ADDR'] directly with a custom variable
    $ip = $_SERVER['REMOTE_ADDR'];
    // Otherwise, using the $_SERVER['REMOTE_ADDR'] directly
    //$city = file_get_contents('http://ipinfo.io/'. $_SERVER['REMOTE_ADDR']. '/city');
    // Using our custom $ip variable
    $city = file_get_contents('http://ipinfo.io/'. $ip. '/city');
    $country = file_get_contents('http://ipinfo.io/'. $ip. '/country');
    //$region = file_get_contents('http://ipinfo.io/'. $ip. '/region');
    // An alternate formatting of City State, Country
    //echo $city.' '.$region.', ' .$country;
    // Print our variables. <br> is a standard HTML line break.
    echo 'Your IP address is:   '.$ip;
    echo '<br>';
    echo 'Your Country name is: '.$country;
    echo '<br>'; 
    echo 'Your City name is:    '.$city;
?>
Вы можете опустить все строки с помощью //, так как это просто комментарии / примеры. Аналогично, строки отображения ошибок (ini_set / error_reporting) предназначены только для отладки. Периоды до и после переменных необходимы для объединения. URL объединяются в 
 Ex. http://ipinfo.io/123.123.123.123/city
и вернуть простой текст в этой форме. Посетите страницу разработчиков ipinfo.io , чтобы узнать, что можно вернуть. Код выше возвращает:
Ex.
    Your IP address is :  xxx.xxx.xxx.xxx
    Your Country name is: US
    Your City name is:  Las Vegas
С другой стороны, если вы хотите, чтобы "Соединенные Штаты" против "США", вы можете попробовать также попробовать что-то вроде устаревшего API Geobytes City Details . Чтобы вернуть "Соединенные Штаты":
<?php
    function getIP() {
      foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) {
         if (array_key_exists($key, $_SERVER) === true) {
           foreach (explode(',', $_SERVER[$key]) as $ip) {
             if (filter_var($ip, FILTER_VALIDATE_IP) !== false) {
                   return $ip;
                }
             } 
          }
       }
    }
    $tags=json_decode(file_get_contents('http://getcitydetails.geobytes.com/GetCityDetails?fqcn='. getIP()), true);
    // Prints all available members of the $tags array, in case we forget our options
    //print_r($tags);
    // $tags[geobytesipaddress]) creates a non-fatal error so we use '' quotes around the array elements.
    print_r('Your IP address is: ' .$tags['geobytesipaddress']);
    echo '<br>';
    print_r('Your Country name is: ' .$tags['geobytescountry']);
    echo '<br>'; 
    print_r('Your City name is:    ' .$tags['geobytescity']);
    ?>
Это только слегка измененный пример кода со страницы Geobytes. Как написано, он дублирует выходные данные первого примера кода, но с полным названием страны:
Ex.
    Your IP address is :  xxx.xxx.xxx.xxx
    Your Country name is: United States
    Your City name is:  Las Vegas
Напомним, что API Geobytes, похоже, поддерживает несколько дополнительных параметров, чем ipinfo.io, и обеспечивает гораздо более высокую частоту неоплачиваемых запросов (если это имеет значение).