209 votes

Obtenir la localisation à partir d'une adresse IP

Je veux récupérer des informations comme la ville, l'état et le pays d'un visiteur à partir de son adresse IP, afin de pouvoir personnaliser ma page Web en fonction de sa localisation. Existe-t-il un moyen efficace et fiable de faire cela en PHP ? J'utilise JavaScript pour les scripts côté client, PHP pour les scripts côté serveur et MySQL pour la base de données.

8voto

lpfavreau Points 5622

Je ferai la même réponse que moi aquí car le service est également disponible pour PHP :

J'aime la gratuité Ville GéoLite de Maxmind qui fonctionne pour la plupart applications et à partir duquel vous pouvez version payante si elle n'est pas assez pas assez précis. Il existe un PHP API inclus, ainsi que pour d'autres langues. Et si vous exécutez Lighttpd comme serveur web, vous pouvez même utiliser un module pour obtenir les informations dans la variable SERVER pour chaque visiteur si c'est ce dont vous avez besoin.

J'ajouterai qu'il existe également un Pays de la géolite (ce qui serait plus rapide si vous n'avez pas besoin de préciser la ville d'où provient l'IP) et Geolite ASN (si vous voulez savoir à qui appartient l'IP). IP) et qu'enfin tout cela est téléchargeables sur votre propre serveur, sont serveur, sont mis à jour chaque mois et sont assez rapide à consulter avec les API fournies comme ils le disent "des milliers de recherches par seconde".

1 votes

Vous pouvez considérer l'IP2Location LITE lite.ip2location.com qui est gratuit. Il contient des informations jusqu'au code ZIP, ce qui est très utile.

7voto

James Cape Points 482

En supposant que vous souhaitiez le faire vous-même et ne pas dépendre d'autres fournisseurs, IP2Nation fournit une base de données MySQL des mappings qui sont mis à jour au fur et à mesure des modifications apportées par les registres régionaux.

0 votes

J'utilisais un service externe et soudain mon site web est devenu très lent. Le service externe mettait une bonne vingtaine de secondes à renvoyer les informations, ce qui est évidemment désastreux pour les visiteurs. J'ai donc décidé de le faire moi-même, et cette solution est parfaite. Merci beaucoup.

6voto

Ian Hunter Points 2114

PHP a un extension pour cela.

De PHP.net :

L'extension GeoIP vous permet de trouver la localisation d'une adresse IP. La ville, l'État, le pays, la longitude, la latitude, et d'autres informations comme toutes, comme le FAI et le type de connexion peuvent être obtenues avec l'aide de GeoIP.

Par exemple :

$record = geoip_record_by_name($ip);
echo $record['city'];

4 votes

Il s'agit simplement d'un module php pour la base de données MaxMind, qui est payante. (Les versions gratuites "lite" sont très imprécises.) Je ne dis pas que c'est une mauvaise chose, mais ce n'est vraiment utile qu'à des fins commerciales.

4voto

SpYk3HH Points 10533

Ce qui suit est une version modifiée d'un extrait que j'ai trouvé et qui utilise les éléments suivants http://ipinfodb.com/ip_locator.php pour obtenir ses informations. N'oubliez pas que vous pouvez également demander une clé API auprès d'eux et utiliser directement l'API pour obtenir les informations fournies comme bon vous semble.

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 = 'http://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 => 'http://' . $_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('{<li>City : ([^<]*)</li>}i', $content, $regs)) $araResp['city'] = trim($regs[1]);
    if (preg_match('{<li>State/Province : ([^<]*)</li>}i', $content, $regs)) $araResp['state'] = trim($regs[1]);
    if (preg_match('{<li>Country : ([^<]*)}i', $content, $regs)) $araResp['country'] = trim($regs[1]);
    if (preg_match('{<li>Zip or postal code : ([^<]*)</li>}i', $content, $regs)) $araResp['zip'] = trim($regs[1]);
    if (preg_match('{<li>Latitude : ([^<]*)</li>}i', $content, $regs)) $araResp['latitude'] = trim($regs[1]);
    if (preg_match('{<li>Longitude : ([^<]*)</li>}i', $content, $regs)) $araResp['longitude'] = trim($regs[1]);
    if (preg_match('{<li>Timezone : ([^<]*)</li>}i', $content, $regs)) $araResp['timezone'] = trim($regs[1]);
    if (preg_match('{<li>Hostname : ([^<]*)</li>}i', $content, $regs)) $araResp['hostname'] = trim($regs[1]);

    $strResp = ($araResp['city'] != '' && $araResp['state'] != '') ? ($araResp['city'] . ', ' . $araResp['state']) : 'UNKNOWN';

    return $asArray ? $araResp : $strResp;
}

A utiliser

detect_location();
//  returns "CITY, STATE" based on user IP

detect_location('xxx.xxx.xxx.xxx');
//  returns "CITY, STATE" based on IP you provide

detect_location(NULL, TRUE);    //   based on user IP
//  returns array(8) { ["city"] => "CITY", ["state"] => "STATE", ["country"] => "US", ["zip"] => "xxxxx", ["latitude"] => "xx.xxxxxx", ["longitude"] => "-xx.xxxxxx", ["timezone"] => "-07:00", ["hostname"] => "xx-xx-xx-xx.host.name.net" }

detect_location('xxx.xxx.xxx.xxx', TRUE);   //   based on IP you provide
//  returns array(8) { ["city"] => "CITY", ["state"] => "STATE", ["country"] => "US", ["zip"] => "xxxxx", ["latitude"] => "xx.xxxxxx", ["longitude"] => "-xx.xxxxxx", ["timezone"] => "-07:00", ["hostname"] => "xx-xx-xx-xx.host.name.net" }

2voto

Roman Pushkin Points 1492

Vous pouvez également utiliser le service "smart-ip" :

$.getJSON("http://smart-ip.net/geoip-json?callback=?",
    function (data) {
        alert(data.countryName);
        alert(data.city);
    }
);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X