Skip to content

connorholt/phalcon_project

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

22 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Поиск местопололожения по ip

Используемые технологии:

  1. Php framework phalcon (phalcon устанавливается как расширение php, затем надо поставить dev-tools (https://docs.phalconphp.com/en/3.0.2/reference/tools.html), и создать папку с проектом ip, сделать в папку git clone)
  2. Postgres
  3. Расширение postgres ip4r (https://github.com/RhodiumToad/ip4r)
  4. База ip адресов ip2location http://lite.ip2location.com/database/ip-country-region-city-latitude-longitude-zipcode-timezone
  5. Для запуска тестов нужен phpunit, также в composer dev-tools добавить https://github.com/phalcon/incubator

Установка проекта:

  1. Поставить phalcon, postgres + ip4r
  2. Положить файлы с ip адресами в папку /public/files, два файла для ipv4 и для ipv6
  3. Запустить миграции: phalcon migration run
  4. Запустить консольный скрипт, которые с csv перенес все ip адреса в нужном формате в базу: php app/cli.php copy-data main 4 и потом чтобы перенести ipv6 php app/cli.php copy-data 6
  5. Проверить поиск можно по url /ipv4/get/{ip}, где {ip} адрес в формате x.x.x.x, результат будет json с координатами города

Как это работает?

  1. Для поиска среди интервалов ip адресов используется расширение postgres ip4r, и функциональный индекс ip4r(ip_from, ip_to)
  2. Копирование новых ip адресов, базу адресов с сайта можно копировать используя wget и класть в папку с файлами, на крон можно поставить раз или два в месяц запускать скрипт который копирует адреса в базу, работа скрипта никак не повлияет на произовдительность, копирование происходит следуюущем образом:
  • Начало транзакции
  • Создается временная таблица для новых ip адресов
  • Обходим файл с ip адресами и вставляем в базу по 1000
  • Когда обошли весь файл, переименовываем старую таблицу в {table}_old
  • Переименовываем новую таблицу в название как в системе т.е. в {table}
  • У сиквенса меняем таблицу на {table}
  • Удаляем {table}_old
  • Если все ок, завершаем транзакцию
  1. Для поиска, в модели создан метод finByIp()

Результат:

  1. Поиск в базе среди ~4000000 ip адресов (v4), по id занимает в среднем 0,02 ms
  2. Поиск в базе среди ~4000000 ip адресов (v4), по интервалу ip занимает в среднем 0,07 ms

@todo

  1. Обернуть в докер

About

No description or website provided.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published