Нашел в интерне базу IP адресов с городами, ссылки: http://habrahabr.ru/post/120872/, http://netload.biz/2011/12/31/geoip5/ . База неточная, но лучше чем ничего. Поставить её несложно, однако, при установке самой базы и обновления были некоторые нюансы, может быть кому-то будет интересно почитать…
- Выполняем скрипт geo_update_2011_12.sql и затем сразу geo_update_2011_12.sql. Мне лично пришлось заменить “TYPE=MyISAM” на “ENGINE=MyISAM” в каждом скрипте (У меня MySQL Ver 14.14 Distrib 5.5.29, for debian-linux-gnu (i686) using readline 6.2)
- Скачиваем и распаковываем три файла http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip, http://geolite.maxmind.com/download/geoip/database/GeoLiteCity_CSV/ и http://ipgeobase.ru/files/db/Main/geo_files.zip в каталог net_update чтобы он выглядел следующим образом:
cidr_optim.txt cities.txt db.php GeoIPCountryWhois.csv GeoLiteCity-Blocks.csv GeoLiteCity-Location.csv lib.php readme.txt update_maxmind.php update_ru.php
- Запускаем скрипты обновления из браузера, предварительно увеличив максимальное время выполнения скрипта, см http://rtcamp.com/tutorials/increase-php-script-execution-time-with-nginx/ или с командной строки, см http://www.ozonesolutions.com/programming/2011/09/execute-php-5-script-command-line-ubuntu-linux/, что намного правильнее, так как в этом случае вывод виден по мере появления, а не на момент завершения скрипта:
$ php5 update_ru.php Added countries blocks: 118884 Added cities blocks: 43355 $ php5 ./update_maxmind.php Added countries blocks: 97897 update net_city_ip set `verified`=1 where city_id=244
update_maxmind.php почему-то не проходит, как видно из кода, падает в этом месте:
// Отмечаем блоки проверенных городов $sql = "select * from net_city"; $result = mysql_query($sql); while ($row = mysql_fetch_array($result)) { $city_id = $row['id']; $usql = "update net_city_ip set `verified`=1 where city_id=$city_id"; mysql_query($usql) or die($usql); }
оказывается, всё очень просто – нужно убрать кавычки в одном запросе, то есть заменить строчку 81:
// Обновляем города $fp = fopen ("./GeoLiteCity-Blocks.csv", "r"); if ($fp) { // Удаляем все старые записи mysql_query("truncate net_city_ip"); // Добавляем временное поле mysql_query("alter table net_city_ip add column `verified` bit(1) null default '0'");
на
mysql_query("alter table net_city_ip add column `verified` bit(1) null default 0");
теперь вроде всё нормально:
$ php5 update_maxmind.php Added countries blocks: 97897 Added cities blocks: 1520015