Mostrando il mio paese basato sul mio IP, mysql ottimizzato

Ho scaricato la tabella dei mondi di WIPmania da http://www.wipmania.com/en/base/ – la tabella ha 3 campi e circa 79k righe:

  • startip // esempio: 3363110912
  • endip // esempio: 3363112063
  • paese // esempio: AR (Argentina)

Quindi, supponiamo di essere in Argentina e il mio indirizzo IP sia: 200.117.248.17

1) Uso questa function per convertire il mio ip in 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) Cerco il codice paese corretto facendo corrispondere l'ip lungo convertito:

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

che è equivalente a: SELEZIONA paese DA worldip DOVE 3363174417 TRA startip E endip (punto di riferimento: Mostra righe 0 – 0 (1 totale, Query ha impiegato 0,2109 sec))

Ora arriva la vera domanda .

Che cosa succede se un altro gruppo di ragazzi argentini apre anche il sito web e hanno tutti questi indirizzi IP:

  • 200.117.248.17
  • 200.117.233.10
  • 200.117.241.88
  • 200.117.159.24

Poiché sto memorizzando nella cache tutte le query SQL; invece di abbinare OGNI delle query IP nel database, sarebbe meglio (e giusto) solo per abbinare le 2 prime sezioni dell'ip modificando la function in questo modo?

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

(notare che il 3 ° e il 4 ° valori divisi dell'IP sono stati rimossi).

In questo modo invece di interrogare questi 4 valori:

  • 3363174417
  • 3363170570
  • 3363172696
  • 3363151640

… tutto quello che devo interrogare è: 3363110912 (che è 200.117, 0.0 convertito in long).

È giusto? qualche altra idea per ottimizzare questo process?

Devi assolutamente usare WIPmania? in caso contrario, Maxmind offre una soluzione open source: http://www.maxmind.com/app/geolitecountry . Il vantaggio è che si tratta di un file binario, e c'è un'estensione PHP (dovresti compilarlo e installarlo). Utilizzato su un paio di progetti, le ricerche sono velocissime. È ansible get l'estensione PCL qui: http://pecl.php.net/package/geoip

No.

193.150.1.1 – IP russo 193.150.230.1 – IP svedese

Probabilmente potresti troncarlo ai primi tre ottetti, ma … non avresti tanti hit nella cache. Ed è molto probabile che qualche / 24 networking sia divisa tra due paesi. A volte, vengono forniti blocchi più piccoli di / 24.