- Php framework phalcon (phalcon устанавливается как расширение php, затем надо поставить dev-tools (https://docs.phalconphp.com/en/3.0.2/reference/tools.html), и создать папку с проектом ip, сделать в папку git clone)
- Postgres
- Расширение postgres ip4r (https://github.com/RhodiumToad/ip4r)
- База ip адресов ip2location http://lite.ip2location.com/database/ip-country-region-city-latitude-longitude-zipcode-timezone
- Для запуска тестов нужен phpunit, также в composer dev-tools добавить https://github.com/phalcon/incubator
- Поставить phalcon, postgres + ip4r
- Положить файлы с ip адресами в папку /public/files, два файла для ipv4 и для ipv6
- Запустить миграции: phalcon migration run
- Запустить консольный скрипт, которые с csv перенес все ip адреса в нужном формате в базу: php app/cli.php copy-data main 4 и потом чтобы перенести ipv6 php app/cli.php copy-data 6
- Проверить поиск можно по url /ipv4/get/{ip}, где {ip} адрес в формате x.x.x.x, результат будет json с координатами города
- Для поиска среди интервалов ip адресов используется расширение postgres ip4r, и функциональный индекс ip4r(ip_from, ip_to)
- Копирование новых ip адресов, базу адресов с сайта можно копировать используя wget и класть в папку с файлами, на крон можно поставить раз или два в месяц запускать скрипт который копирует адреса в базу, работа скрипта никак не повлияет на произовдительность, копирование происходит следуюущем образом:
- Начало транзакции
- Создается временная таблица для новых ip адресов
- Обходим файл с ip адресами и вставляем в базу по 1000
- Когда обошли весь файл, переименовываем старую таблицу в {table}_old
- Переименовываем новую таблицу в название как в системе т.е. в {table}
- У сиквенса меняем таблицу на {table}
- Удаляем {table}_old
- Если все ок, завершаем транзакцию
- Для поиска, в модели создан метод finByIp()
- Поиск в базе среди ~4000000 ip адресов (v4), по id занимает в среднем 0,02 ms
- Поиск в базе среди ~4000000 ip адресов (v4), по интервалу ip занимает в среднем 0,07 ms
- Обернуть в докер