Гео-таргетинг, як зробити своїми руками

Версія для друку

Для цього я зібралася використовувати мову PHP. Я не дуже добре знаю цю мову, тому попросила допомогти моїх колег-програмістів - ось вона в бізнес-процеси по-жіночому. Хороші програмісти люблять робити те чого ніхто до них не робив, або що зробити надзвичайно важко, а поодинці здається нереально, технологи нашої славної фірми Analog-group (зокрема спасибі mr.troll) не виняток. Сайт компанії звичайно надзвичайно жахливий, але це хитрий хід щоб не привертати клієнтів, а то приходять і платять багато грошей, доводиться працювати =). Ймовірно начальство заборонить цю статтю в бложіке публікувати, але все ж написати треба.

Зараз я з якоїсь допомогою напишу як оптимізувати і виконати пошук даних на мові PHP.

Отже, завдання: зробити пошук по країнам, а для Росії ще й по містах. Для пошуку по країнам качаємо файл з ip країн і розпаковуємо з нього файл GeoIPCountryWhois.csv.

Софт який пропонується для пошуку з цього файлу теж не оптимізований, тому оптимізуємо сам файл:

Замість 8ми мегабайт даних отримали всього 1 мегабайт, непогано, так? Тепер про те що ми тут зробили, вихідний файл є записи типу:

C сайту ipgeobase.ru треба завантажити файл db_files.tar.gz (або .zip). Розпакувати звідти файл cidr_ru_slave_index.db в папку geo_ip, туди ж скинути інше господарство. Цей файл невеликий 300кб, так що його ми не оптимізували.

Для пошуку за російськими ip потрібно завантажити цей файл в оперативну пам'ять (масив), а потім вже шукати по масиву, функції для пошуку такі:

Детально про те як ми шукаємо по всьому світу: Файл з даними не завантажується в оперативну пам'ять, що сильно її економить. Пошук і читання проводиться відразу з файлу на диску. Пошук проводиться методом дихотомії, тобто після кожної ітерації в циклі ми знаємо більше число нам треба отримати або менше. Виходить що з 100000 діапазонів ми можемо знайти потрібний з максимум 17й спроби. Швидкість читання з файлу насправді колосально швидка, тому швидкість пошуку істотно випередить то що запропоновано umi-cms і CN software.

Користуватися функціями можна так:

Де $ temp може бути як в звичному форматі 127.0.0.1 так і числом. Спочатку виконується пошук по россии, і якщо нічого не знайдено, тоді вже шукається по всьому світу.

P.S. Щас ще спробую оптимізувати майстер файл щоб 300 кілобайт масив в оперативну пам'ять не завантажувати, а шукати прямо на диску, хоча зараз пошук теж використовує дихотомію.

Прокоментує статтю, хоча б пару слів!

Спасибо большое за статтю, намагався зрозуміти на що схожий php і ось тільки тут побачив сліди C або C ++, хоч тепер стало зрозуміло як на ньому писати програми, проводити доступ до файлів, питання в наступному - на якій машині буде проводитися обробка? на машині сервера сайту або на машині відвідувача?
while (! feof ($ handle)) - думаю не найкращий варіант (а раптом в кінці файлу прогалин багато)
краще зробити щось на подобі while (fscanf (File, "% i.% i.% i.% i", ip1, ip2, ip3, ip4) == 4)
тоді при зчитуванні прогалин він дійде до кону файлу і спокійно вийде повернувши 0 або негативний код помилки, а так можуть виникнути проблеми у вигляді дублікатів даних.
Як працювати з потоком не розбирався, не могли б ви пояснити як працює $ buffer = fgets ($ handle, 4096);
list ($ start, $ stop, $ inetnum, $ country, $ city, $ region, $ district, $ status, $ slave, $ n_slave) = split ( "", $ buffer) ;, list і split стандартні функції?

PHP - серверний мова. Найправильніший спосіб, це використовувати
while ($ buffer = fgets ($ handle, 4096))
fgets () - читає наступний рядок (максимум 4096 символів), в пхп5 максимум можна не вказувати. list і split - стандартні функції.

Хочу зазначити що використовуються бази російських IP мають неправильну структуру: в відсутній один рівень, має бути п'ять "село / місто-> ра-> регіон / область-> суб'єкт РФ-> аміністратівно округ". Тому точної цю базу ніяк не назвеш.

Нормальною БД я не знайшов, так що на жаль. доводиться користуватися тим що є.

А якого рівня тут не вистачає? На мій погляд рівня міста цілком вистачає для орієнтування.

Схожі статті