Показываю мою страну на основе моего IP, оптимизирован mysql - PullRequest
1 голос
/ 17 июня 2010

Я скачал таблицу worldip WIPmania из http://www.wipmania.com/en/base/ - в таблице 3 поля и около 79k строк:

  • startip // пример: 3363110912
  • endip // пример: 3363112063
  • страна // пример: AR (Аргентина)

Итак, предположим, что я нахожусь в Аргентине, и мой IP-адрес: 200.117.248.17

1) Я использую эту функцию для преобразования моего ip в long

function ip_address_to_number($ip) {
    if(!$ip) {
        return false;
    } else {
        $ip = split('\.',$ip);
        return($ip[0]*16777216 + $ip[1]*65536 + $ip[2]*256 + $ip[3]);
    }
}

2) Я ищу правильный код страны, сопоставляя длинный преобразованный ip:

$sql = 'SELECT * FROM worldip WHERE '.ip_address_to_number($_SERVER['REMOTE_ADDR']).' BETWEEN startip AND endip';

, что эквивалентно: ВЫБЕРИТЕ страну ИЗ WorldIP, ГДЕ 3363174417 МЕЖДУ Startip И Endip (тест: отображение строк 0 - 0 (всего 1, запрос занял 0,2109 с))

Теперь приходит реальный вопрос .

Что, если другая группа аргентинских парней также откроет веб-сайт, и у них у всех есть эти IP-адреса:

  • 200.117.248.17
  • 200.117.233.10
  • 200.117.241.88
  • 200.117.159.24

Так как я кеширую все SQL-запросы; вместо сопоставления КАЖДОГО из ip-запросов в базе данных, было бы лучше (и правильно) просто сопоставить 2 первых раздела ip, изменив функцию следующим образом?

function ip_address_to_number($ip) {
    if(!$ip) {
        return false;
    } else {
        $ip = split('\.',$ip);
        return($ip[0]*16777216 + $ip[1]*65536);
    }
}

(обратите внимание, что 3-е и 4-е разделенные значения IP были удалены).

Таким образом, вместо запроса этих 4 значений:

  • 3363174417
  • 3363170570
  • 3363172696
  • 3363151640

... все, что мне нужно запросить: 3363110912 (что составляет 200.117. 0.0 преобразовано в long).

Это правильно? есть другие идеи по оптимизации этого процесса?

Ответы [ 2 ]

2 голосов
/ 17 июня 2010

номер

193.150.1.1 - русский IP 193.150.230.1 - шведский IP

Возможно, вы могли бы усечь его до первых трех октетов, но ... у вас не было бы такого количества попаданий в кеш. И очень вероятно, что некоторая сеть / 24 разделена между двумя странами. Иногда выдаются блоки меньше / 24.

1 голос
/ 17 июня 2010

Вы обязательно должны использовать WIPmania?в противном случае Maxmind предлагает решение с открытым исходным кодом: http://www.maxmind.com/app/geolitecountry. Преимущество заключается в том, что это бинарный файл и расширение PHP (его нужно скомпилировать и установить).Использовал его на нескольких проектах, поиски быстро вспыхнули.Вы можете получить расширение PCL здесь: http://pecl.php.net/package/geoip

...