Я скачал таблицу 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).
Это правильно? есть другие идеи по оптимизации этого процесса?