Have a Snippet?

Keep, track and share your code snippets with your friends

PHP: Determination of the country by IP Share on Vkontakte

Determination of the country by IP using geoplugin.net OR ipinfodb.com. Will return the country code in "Alpha-2 ISO 3166-1" format (a two-char code)

function get_country($ip_addr) {
    $curlopt_useragent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0';
    $url = 'http://www.geoplugin.net/php.gp?ip=' . $ip_addr;
    $ch1 = curl_init();
    curl_setopt($ch1, CURLOPT_URL, $url);
    curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1);
    $result = curl_exec($ch1);
    $geoplugin = unserialize($result);

    if ($geoplugin[geoplugin_countryCode] != '') {
        return $geoplugin[geoplugin_countryCode];
    } else {
        $url = 'http://ipinfodb.com/ip_locator.php?ip=' . urlencode($ip_addr);
        $ch = curl_init();

        $curl_opt = array(
            CURLOPT_FOLLOWLOCATION => 1,
            CURLOPT_HEADER => 0,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_USERAGENT => $curlopt_useragent,
            CURLOPT_URL => $url,
            CURLOPT_TIMEOUT => 1,
            CURLOPT_REFERER => 'http://' . $_SERVER['HTTP_HOST'],
        );
        curl_setopt_array($ch, $curl_opt);
        $content = curl_exec($ch);

        if (!is_null($curl_info)) {
            $curl_info = curl_getinfo($ch);
        }

        curl_close($ch);

        if (preg_match('{
  • Country : ([^<]*)}i', $content, $regs)) $country = $regs[1]; return $country; } }

  • Tag: PHP, Geolocation, IP, CURL

    1 Comments

    1. Avatar
      riartem

      30th May 2013, 07:13

      Тут два больших недостатка:
      1. В связи с тем, что скрипт будет ждать выполнения данного запроса и лишь потом продолжать работу, это может затянуться
      2. Все запросы на сервисы геолокации будут идти с одного IP, что может привести к его блокировке.
      Как вариант решения я предлагаю переносить данный функционал во фронтенд ( как пример: https://snippets.pro/snippet/109-javascript-detect-geolocation-coordinates-and-adress/ ), а из фронтенда отправлять на бекэнд запрос, уже содержащий нужную информацию. Это повысит качество вашего приложения, использующего геолокацию.