Pull to refresh

Comments 35

Спасибо.
В архиве обнаружил файл lib.php, в котором хранятся две функции для преображования ip в число и обратно. Скажите, а чем Вас не устроили втроенные функции PHP: ip2long (long2ip)?
Справедливое замечание. Раньше я не знал об этих функциях, сейчас не хочется без нужды править рабочий код.
UFO just landed and posted this here
php ip2long() != mysql inet_aton(); php long2ip() != mysql inet_ntoa()
в этом всё дело. мускульная версия возвращает unsigned и поэтому с адресами из похапе не получится работать в мускуле и наоборот
А с функциями автора проблем не будет?
Вот например, одна из них:
// Преобразуем ip в число
function ip2int($ip)
{
$part = explode(".", $ip);
$int = 0;
if (count($part) == 4) {
$int = $part[3] + 256 * ($part[2] + 256 * ($part[1] + 256 * $part[0]));
}
return $int;
}
Что касается ip2long, то можно сделать вот так:
$ip_dotted = '127.0.0.1';
$ip_long = sprintf("%u", ip2long($ip_dotted));

И проблем с inet_aton() не должно быть.
UFO just landed and posted this here
Вопрос: А есть ли подобные базы с ipv6 адресами?
>> поэтому операция требует значительных ресурсов и времени (~30-60 минут).

В вашем скрипте используется одиночные инсерты.
Что бы увеличить скорость работы скрипта сделайте:
insert into (..) values (...), (...), (...)… (...) до 100-1000 таких блоков, больше не нужно. Скорость выполнения повысится на порядок.
Благодарю за совет, поэкспериментирую.
Когда-то писал либу CachedInsert для PHP: записи insert'ятся блоками по достижению указанного количества вставок. Могу поделиться, использовал для работы с данными OSM, ощутимо прибавляло производительности.
дня за три до этого поста я скачал вашу базу:)

у меня несколько вопросов:

1) net_city_ip, net_ru, net_ru_2, net_su — почему несколько таблиц для связи ip и городов? чем они отличаются?
2) в таблице net_city есть поле region — он уникален в пределах страны? Что это вообще за обозначение такое? ( дайте ссылку на википедию, если можно )

Кстати в вашей базе я нашел дубль с одинаковым country_id и region — город Мюнхен в Германии. Вы бы скриптом прошлись для удаления записей с одинаковым именем, country_id и region…
1.
net_city_ip — блоки IP городов из maxmind (весь мир)
net_ru — блоки IP городов из ipgeobase (Россия и Украина)
(обе таблицы привязаны к справочнику net_city)
net_ru_2 и net_su больше не используются (были в прошлой версии базы)

2. Поле region взято из данных maxmind и содержит много ошибок (может быть кроме штатов США).
Для последнего проекта не нашли ничего лучше для определения региона в России, чем ipgeobase. Есть модуль для интеграции ipgeobase в django.

Ваш вариант, конечно, намного интересней, но до июня обновлений вроде не было базы? А последний апдейт был зимой, кажется.
Если вам нужна только Россия и/или Украина, то однозначно лучший вариант ipgeobase. Основное отличие моей сборки в том, что за счет maxmind кое-как определяет города по всему миру (пока далеко от идеала, есть над чем работать) и есть названия на русском и английском (иногда с ошибками).
Меня в основном смущает, что база до сего дня не обновлялась, а сейчас обновляется, но без добавления новых городов.

Ну и ~4 миллиона select-ов и ~2 миллиона insert-ов это, конечно, жестоко. С инсёртами подсказали уже выше, я думаю селекты тоже можно уменьшить как-нибудь.
maxmind обновляет базу раз в месяц (1-2 числа). Скрипт обновления можно (нужно) запускать на локальной машине, а потом выкладывать дамп на сервер.

Есть идеи качественного улучшения базы, но когда дойдут руки до этого не могу сказать, ничего не обещаю.
Спасибо, нужная вещь. Косяков правда хватает. Например, с 95.28.226.140 демка меня отправляет в Питер (а я в Москве).
Определение городов всегда было весьма условным, особенно если IP принадлежат крупным провайдерам, охватывающим несколько регионов.
UFO just landed and posted this here
Очевидное решение — сделать автоподстановку страны и города по IP с возможностью ручного выбора пользователем. Если скрипт угадает правильно, то посетителю не придется делать лишние движения, а не угадает — посетитель исправит ошибку.

По поводу Qt4 ничего не могу сказать, не в теме.
UFO just landed and posted this here
Боюсь, не смогу вам помочь. Теоретически вы можете использовать справочники из базы без заморочек на IP (net_country — страны, net_city- города). Каким именно их подключить в Qt я не знаю.
Оптимизирован скрипт обновления базы maxmind, операция выполняется быстрее и потребляет меньше вычислительных ресурсов. Благодарю shushu за полезный совет.
UFO just landed and posted this here
Хотелось бы регионы получить для всех стран. В net_city номер в поле region для всех проставлен, но таблицы нет соответсвующей. Можно выцепить данные регионы РФ и Украины из другой таблицы, но этого мало. Ведь эти данные должны где-то быть, region то не просто так наверно проставлялся?
Справочник регионов www.maxmind.com/app/fips10_4
Но как минимум по России в этом справочнике есть ошибки и дубли. Другие страны не проверял.
В БД есть 7 несоответствий между net_city и net_t_city, выявляются по запросу:

SELECT * FROM `net_city`
INNER JOIN `net_t_city`
WHERE
net_city.id = net_t_city.link_id AND
net_city.name_ru <> net_t_city.name


Две ошибки:

ID 33912 из net_city ошибочно указано, должен быть Ростов, а указан Ростов-на-Дону.
ID 75169 из net_city так же не верно русское название, написан Арзамас, по координатам это Саров.

Остальные 5 — разные написания, не критично (с дефисами и сокращениями).

А для чего таблица net_t_dub, кто-нибудь может подсказать?
Очень было бы здорово, если появился бы апйдет. Спасибо!
Sign up to leave a comment.

Articles