Aqui el script de instalación de la base de datos:
#!/bin/bash # Script: geoip.sh # Author: Alberto Isaac Ayala Esquivias # E-mail: <albertoi7@gmail.com> # Web: http://albertux.ayalasoft.com clear echo "=====================================-" echo " GeoIp MySQL Database Easy Installer. " echo "======================================" echo "" echo "Script Created By http://AyalaSoft.com "; echo "" stty -echo read -p "MySQL root password: " mysql_pass; echo stty echo echo -n "Do you want to create database of MySQL (y/n): " read op if [ "$op" = "y" ]; then echo -n "Create new database, name: " read database mysqladmin -u root --password=$mysql_pass create $database else echo -n "Which database do you want to use to insert 'geoip' table: " read database fi echo -e "\nDownload [ GeoIPCountryCSV.zip ]" wget -c "http://www.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip" echo -e "\nUnZip [ GeoIPCountryCSV.zip ]" unzip GeoIPCountryCSV.zip echo -e "\nInsert geoip table to database $database" awk -F, ' { print $3","$4","$5","$6 }' GeoIPCountryWhois.csv | sed s/\"//g > /tmp/geoip.txt chmod 777 /tmp/geoip.txt echo " USE $database; DROP TABLE IF EXISTS geoip; CREATE TABLE geoip ( ip_begin int unsigned, ip_end int unsigned, country varchar(2), country_name varchar(30) ); LOAD DATA LOCAL INFILE '/tmp/geoip.txt' INTO TABLE $database.geoip FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (ip_begin, ip_end, country, country_name); " > geoip.sql mysql -u root --password=$mysql_pass $database < geoip.sql rm /tmp/geoip.txt echo -e "\nFinish."
Aqui un ejemplo de como utilizar la base de datos:
#!/usr/bin/php -q
<?
if (count($_SERVER['argv']) <= 1) {
echo "use: geoip xxx.xxx.xxx.xxx\n";
}
else {
$ip=$_SERVER['argv'][1];
$out=sprintf("%u", ip2long($ip)); // don't ask why, you need this line
$sql="SELECT country_name FROM geoip WHERE ($out BETWEEN ip_begin AND ip_end)";
$link = mysql_connect('localhost','root',''); // HOST, USER, PASS
mysql_select_db('GEOIP'); // DATABASE
$query = mysql_query($sql,$link);
while ($row = @mysql_fetch_array($query,MYSQL_ASSOC)) {
$data[] = $row;
}
if (count($data) == 1) {
echo $data[0]['country_name']."\n";
}
else {
echo "Unknown\n";
}
}
?>Probando el script:
~$ geoip 79.130.90.12
Greece
~$ geoip 207.33.11.33
United States
~$ geoip 148.234.13.23
Mexico
Links:
http://albertux.ayalasoft.com/2008/10/01/geoip-php-script/
http://albertux.ayalasoft.com/2008/08/08/geoip-database-mysql/
Este usuario no ha completado su perfil.
jsanca escribió
hace 1 años
lexlythius escribió
hace 1 años
gracias por el script. dos notas:
1) Esta linea:
$out=sprintf("%u", ip2long($ip)); // don't ask why, you need this line
convierte la ip de la representacion humana a su correspondiente entero de 32 bits. El problema es que si ejecutamos el PHP en un sistema de 32-bit, los número altos (primer byte mayor que 127) exceden el valor entero positivo maximo que maneja PHP. P.ej, la IP 200.80.56.187 (Argentina) resulta en -934266693 [0xc85038bb].
Hay 2 soluciones a este problema: usar un sistema de 64 bits o utilizar el valor hexadecimal con mysql:
select * from geoip
where CONV('c85038bb', 16, 10) BETWEEN ipbegin AND ipend
limit 1;
2) El problema de usar BETWEEN es que no se aprovecha la potencia de los índices de mysql. Siguiendo lo que sugieren acá http://andy.wordpress.com/2007/12/16/fast-mysql-range-queries-on-maxmind-geoip-tables/ reescribí la consulta usando subqueries:
select * from
(
select * from geoip
where ip_end >= CONV('c85038bb', 16, 10)
limit 1
) as firstouterlimit
where ip_begin <= CONV('c85038bb', 16, 10)
limit 1;
y la consulta toma 0.1150 seg contra 0.8094 de la original.
Saludos y gracias de nuevo por compartir
© Copyright 2008-2009 debug_mode=ON | Aviso legal | Contacto | FAQ | ¿Quiénes somos? |
#1
Esto sería perfecto para implementarlo en un WebService e integrarlo en un SOA.
Buen articulo..