Я загрузил worldip-таблицу WIPmania с http://www.wipmania.com/en/base/ – таблица имеет 3 поля и около 79 тыс. Строк:
Итак, давайте предположим, что я в Аргентине, и мой 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';
что эквивалентно: SELECT country FROM worldip WHERE 3363174417 МЕЖДУ startip AND endip (контрольный показатель: Показаны строки 0 – 0 (всего 1, запросов заняло 0.2109 сек))
Что, если другая группа аргентинских парней также откроет сайт, и все они имеют эти IP-адреса:
Так как я кэширую все sql-запросы; вместо того, чтобы сопоставлять EACH с ip-запросами в базе данных, было бы лучше (и правильно) просто соответствовать двум первым разделам 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 значений:
… все, что я должен запросить, это: 3363110912 (то есть 200.117. 0.0 преобразован в длинный).
Это правильно? любые другие идеи для оптимизации этого процесса?
Вам абсолютно необходимо использовать WIPmania? если нет, Maxmind предлагает решение с открытым исходным кодом: http://www.maxmind.com/app/geolitecountry . Преимущество состоит в том, что это двоичный файл, и есть расширение PHP (вам нужно его скомпилировать и установить). Используемый в нескольких проектах, поисковые запросы быстро растут. Вы можете получить расширение PCL здесь: http://pecl.php.net/package/geoip
Нет.
193.150.1.1
– русский IP 193.150.230.1
– шведский IP-адрес
Возможно, вы могли бы усечь его до первых трех октетов, но … у вас не было бы столько хитов кеша. И очень вероятно, что некоторая сеть 24 разделена между двумя турнирами. Иногда выделяются блоки размером меньше / 24.