Intereting Posts
Как я могу присоединиться к трем таблицам с помощью MYSQLi? Сортировка многомерного массива на основе порядка простого массива Ответ на вопрос «Как получить акции Facebook и понравится какой-то URL?» вопросов Запрос PHP DOMXPath с использованием innerHTML / nodeValue элемента для поиска и возврата элемента Cakephp 2 несколько БД Группа Concat, использующая запрос «Красноречивый / сырой ларавел» Проблема создания лучшего случайного алгоритма – ежедневный спред Проблемы mysql_connection – «getaddrinfo failed», «Нет такого хоста»? Сравнение разных строк в PHP с == возвращает true Библиотека PHP со странами, государствами и городами Получить категории детей magento Как проверить частичное сходство двух строк в PHP Как получить символы Юникода для последовательностей: CTRL + B, CTRL + L, ALT + K и т. Д. Получили ли некоторые из них не все? Цикл внутри цикла while mysqli_fetch_array () Как мне создать проект PHP?

Показывая мою страну на основе моего IP, mysql оптимизирован

Я загрузил worldip-таблицу WIPmania с http://www.wipmania.com/en/base/ – таблица имеет 3 поля и около 79 тыс. Строк:

  • 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'; 

что эквивалентно: SELECT country FROM worldip WHERE 3363174417 МЕЖДУ startip AND endip (контрольный показатель: Показаны строки 0 – 0 (всего 1, запросов заняло 0.2109 сек))

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

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

  • 200.117.248.17
  • 200.117.233.10
  • 200.117.241.88
  • 200.117.159.24

Так как я кэширую все 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 значений:

  • 3363174417
  • 3363170570
  • 3363172696
  • 3363151640

… все, что я должен запросить, это: 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.