Долгое время я пользовался библиотекой SxGeo от zapimir. И до недавнего времени меня всё устраивало. Устраивало до тех пор, пока не было необходимости добавлять в БД свои данные.
Не найдя в интернете упаковщика данных от SxGeo и не найдя в себе силы требовать нужный мне функционал от разработчика, было принято решение писать свой костыль. Хотя на это решение повлиял и ещё 2 недостатка используемой библиотеки:
- ограничение по количеству справочников;
- невозможность узнать интервал адресов, в который входит искомый адрес;
- отсутствие пакета в packagist.
Собственно, делюсь с вами своей разработкой.
Отличия между прототипом и моим решением:
- IPTool — это всего лишь инструмент для создания базы данных и поиска в ней, в то время, как проект SxGeo — проект, предоставляющий не только инструментарий, но и сами базы данных;
- База данных IPTool занимает больше места (т.к. первый адрес диапазона хранится полностью и занимает 4 байта, в то время, как в SxGeo только 3 байта);
- IPTool имеет только один режим — чтение данных с диска (Режим подгрузки базы в память — в планах);
- Помимо данных, IPTool возвращает диапазон IP адресов, в который входит искомый адрес;
- IPTool предусматривает методы получения данных из справочников (всех или по порядковому номеру);
- В базе данных IPTool предусмотрена возможность лицензирования самой базы данных;
- IPTool легко устанавливается с помощью Composer;
Использование
Инициализация IP Tool
/* Путь к базе данных - /path/to/iptool.database */
$iptool = new DdrvIptoolIptool('/path/to/iptool.database');
Получение информации о базе данных
print_r($iptool->about());
Array
(
[created] => 1507199627
[author] => Anonymous Author
[license] => MIT
[networks] => Array
(
[count] => 276148
[data] => Array
(
[country] => Array
(
[0] => code
[1] => name
)
)
)
)
Поиск информации об IP адресе
print_r($iptool->find('81.32.17.89'));
Array
(
[network] => Array
(
[0] => 81.32.0.0
[1] => 81.48.0.0
)
[data] => Array
(
[country] => Array
(
[code] => es
[name] => Spain
)
)
)
Получить все элементы справочника
print_r($iptool->getRegister('country'));
Array
(
[1] => Array
(
[code] => cn
[name] => China
)
[2] => Array
(
[code] => es
[name] => Spain
)
...
[N] => Array
(
[code] => jp
[name] => Japan
)
)
Получение элемента справочника по его порядковому номеру
print_r($iptool->getRegister('country',2));
Array
(
[code] => cn
[name] => China
)
)
Процесс создания БД более трудоёмкий, но он описан с документации, которая доступна в репозитории и в wiki GitHub'а на русском и ломаном английском.
Автор: Ivan Dudarev