2010-06-17 14 views
1

J'ai téléchargé la table worldip de WIPmania de http://www.wipmania.com/en/base/ - la table a 3 champs et autour 79k lignes:Afficher mon pays basé sur mon IP, mysql optimisé

  • IPDébut // exemple: 3363110912
  • endip // exemple: 3363112063
  • pays // exemple: AR (Argentine)

Alors, laisse supposer que je suis en Argentine et mon adresse IP est: 200.117.248.17

1) J'utilise cette fonction pour convertir mon ip à longue

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) je recherche le code approprié du pays en faisant correspondre long ip converti:

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

qui est équivalent à: SELECT pays FROM worldip O WH 3363174417 ENTRE startip ET endip (repère: Affichage des lignes 0 - 0 (1 total, Requête a pris 0.2109 sec))

Maintenant vient le réelquestion.

si un autre groupe de gars argentinian ouvrir aussi le site et ils ont tous ces adresses IP:

  • 200.117.248.17
  • 200.117.233.10
  • 200.117.241.88
  • 200.117.159.24

Depuis que je suis en cache toutes les requêtes sql; Au lieu de correspondre CHACUNE des requêtes ip dans la base de données, serait-il préférable (et juste) de simplement faire correspondre les 2 premières sections de l'IP en modifiant la fonction comme ceci?

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

(remarquez que les valeurs 3 et 4 fractionnées de l'adresse IP ont été supprimées).

De cette façon, au lieu d'interroger ces 4 valeurs:

... tout ce que je dois requête est: 3.363.110.912 (qui est de 200,11 0,0 converti en long).

Est-ce exact? d'autres idées pour optimiser ce processus?

+0

qu'en est-il des utilisateurs proxy? –

+1

Si vous venez de lancer un index sur la colonne worldip, les requêtes devraient être rapides. Je parie que les requêtes se termineront en moins de 10 ms. Reportez-vous à ce que vous avez, une fois l'indice en place. Si vous ne l'avez pas déjà fait, vous optimisez prématurément. –

+0

@Srinivas: je peux obtenir ceux avec getenv ('HTTP_X_FORWARDED_FOR'); - Je ne l'ai pas encore ajouté à ce code. @Frank: le fait est que ce site a environ 3 millions de visites par mois. je ne peux pas référencer ce nombre de requêtes jusqu'à ce que ce code soit actif - c'est pourquoi je dois optimiser prématurément;) - j'ajouterai cependant un index: PRIMARY start end – andufo

Répondre

1

Avez-vous absolument besoin d'utiliser WIPmania? sinon, Maxmind propose une solution open source: http://www.maxmind.com/app/geolitecountry. L'avantage est que c'est un fichier binaire, et qu'il y a une extension PHP (vous devrez le compiler et l'installer). Utilisé sur un couple de projets, les recherches sont très rapides. Vous pouvez obtenir l'extension PCL ici: http://pecl.php.net/package/geoip

+0

wow, belle alternative. cela signifie pas de connexions mysql du tout droit? – andufo

+0

Oui, il ne repose pas sur mysql, fonctionne complètement autonome une fois installé ... –

2

N °

193.150.1.1 - russe IP 193.150.230.1 - IP suédois

Vous pourriez tronquer trois premiers octects, mais ... vous n'auriez pas que beaucoup de coups de cache. Et il est très probable que certains/24 réseau est divisé entre deux pays. Parfois, des blocs plus petits que/24 sont distribués.

+0

merci pour le conseil. putain ... ce sera beaucoup de hits. – andufo