Определить GEO-данные по IP
Можно использовать
Пакет
https://github.com/maxmind/GeoIP2-php
php composer.phar require geoip2/geoip2:~2.0
или
composer require geoip2/geoip2:~2.0 - находясь в корневой папке приложения
затем скачал бесплатную базу стран с их офф. сайта
https://dev.maxmind.com/geoip/geoip2/geolite2/
Ну и использование примерно такое должно быть:
use GeoIp2\Database\Reader;
$ip = $_SERVER['REMOTE_ADDR'];
try {
$geoReader = new Reader(Yii::getAlias('@app/components/GeoIP2/GeoLite2-Country.mmdb'));
$record = $geoReader->country($ip);
$country_code = $record->country->isoCode;
} catch (\Exception $e) { //or \InvalidArgumentException
$country_code = null;
}
можно и без try .. catch попробовать $geoReader = new Reader(Yii::getAlias('@app/components/GeoIP2/GeoLite2-Country.mmdb'));
$record = $geoReader->country($_SERVER['REMOTE_ADDR']);
$country_code = $record->country->isoCode;
@app/components/GeoIP2/GeoLite2-Country.mmdb - это путь по которому лежит БД geoip2 - это файл с расширением .mmdb
И так же сравнить со вторым способом путем парсинга через апи
https://api.2ip.ua/geo.json?ip=54.36.148.77
https://api.2ip.ua/provider.json?ip=54.36.148.77
https://api.2ip.ua/hosting.json?site=54.36.148.77
здесь ограничение 1000 запросов в стуки через апи.
Сделать выводы по поводу точности первого и второго метода.
Список ip предоставлю для тестов.