> Manuales > Manual de CodeIgniter

Cómo localizar a un visitante desde el servidor por medio de su IP, a través de PHP realizado con el framework PHP Codeigniter.

La Geolocalización por IP es la determinación de tu ubicación geográfica por medio del dispositivo que utilices para la conexión a Internet.

Debido al rango de IP asignadas por áreas y proveedores en el mundo, podemos determinar, dado el IP de un dispositivo, su ubicación en algunos casos aproximada y en otros casos muy especifica.

La geolocalizacion nos puede ayudar para mostrar contenidos según las zonas geográficas. Por ejemplo, tanto en proyectos pequeños como grandes, si podemos saber desde dónde nos visitan, podemos mostrar publicidad enfocada a la zona, cambiar el idioma del contenido, o sencillamente, crear estadísticas de nuestras visitas para tomar decisiones sobre el futuro target al que se enfocaría nuestra web.

En este caso, vamos a usar las herramientas que nos provee una empresa dedicada a soluciones de este tipo como www.maxmind.com

La empresa ofrece gratuitamente librerías y actualizaciones de las bases de datos con rangos IP. Podemos comenzar por ir directamente a la página de descarga.

Descargamos el archivo php-1.11.tar.gz (o la versión que corresponda cuando leas este artículo) y procedemos a extraerlo en una carpeta temporal.

En nuestro directorio de aplicación de Codeigniter /application, creamos una carpeta con el nombre "timezone" y procedemos a copiar de la carpeta temporal los archivos.

Posteriormente, descargamos el archivo GeoLiteCity.dat.gz en la página geolite.maxmind.com/download/geoip/database

Nota: Éste último es la base de datos que se mantiene actualizada con los rangos de IP.

Descomprimimos el archivo en el directorio de aplicación de Codeigniter /application/timezone.

En estos momentos, deberían haber los siguientes archivos en dicha carpeta:

Scripts PHP para geolocalizar con la IP en Codeigniter

Una vez tengamos todo esto listo, ya estamos en codiciones de empezar a programar para usar este sistema de geolocalización basada en PHP, con programación en el servidor, a través del análisis de la IP del visitante.

1) Creamos nuestro archivo de librería (directorio application/libraries)

Será un a archivo al que podemos llamar timezone.php, con el siguiente contenido:

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
class Timezone
{

var $gmt_timezone = 'Europe/London';
var $timezones = array(
'-12' => 'UM12',
'-11' => 'UM11',
'-10' => 'UM10',
'-9' => 'UM9',
'-8' => 'UM8',
'-7' => 'UM7',
'-6' => 'UM6',
'-5' => 'UM5',
'-4' => 'UM4',
'-3.5' => 'UM25',
'-3' => 'UM3',
'-2' => 'UM2',
'-1' => 'UM1',
'0' => 'UTC',
'1' => 'UP1',
'2' => 'UP2',
'3.5' => 'UP25',
'3' => 'UP3',
'4.5' => 'UP35',
'4' => 'UP4',
'4.5' => 'UP45',
'5' => 'UP5',
'6' => 'UP6',
'7' => 'UP7',
'8' => 'UP8',
'9.5' => 'UP85',
'9' => 'UP9',
'10' => 'UP10',
'11' => 'UP11',
'12' => 'UP11',
);

function __construct()
{
   $this->ci =& get_instance();
   include_once(APPPATH."timezone/geoipcity.inc");
   include_once(APPPATH."timezone/geoipregionvars.php");
}

function get_country_code_by_ip($ip)
{
   $gi = geoip_open(APPPATH."timezone/GeoLiteCityIp6.dat",GEOIP_STANDARD);
   $record = geoip_record_by_addr($gi,$ip);
   geoip_close($gi);

   return $record->country_name;
}

function get_country_code_by_city($ip)
{
   $gi = geoip_open(APPPATH."timezone/GeoLiteCityIp6.dat",GEOIP_STANDARD);
   $record = geoip_record_by_addr($gi,$ip);
   geoip_close($gi);

   return $record->city;
}

function get_region_by_ip($ip)
{
   $gi = geoip_open(APPPATH."timezone/GeoLiteCity.dat",GEOIP_STANDARD);
   $record = geoip_record_by_addr($gi,$ip);
   geoip_close($gi);

   return $record->region;
}

}

2) Controlador para usar la anterior librería

Ahora crearemos el controlador a usar, en este caso "welcome", de nuestra carpeta de controladores ( / application/controllers)

Con el siguiente y básico contenido:

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
class Welcome extends CI_Controller {

function __construct()
{
   parent::__construct();
   $this->load->library('timezone');
}

function index(){
   echo "La ip es ".$this->input->ip_address()."<br />";
   if ($this->input->ip_address()<>'127.0.0.1'){
      echo 'Pais: <br />';
      echo $this->timezone->get_country_code_by_ip($this->input->ip_address());
      echo '<br />Región:<br />';
      echo $this->timezone->get_region_by_ip($this->input->ip_address());
      echo '<br />Ciudad: <br />';
      echo $this->timezone->get_country_code_by_city($this->input->ip_address());
      echo '<br />';
   }else{
      echo "El ejemplo no funciona en con ip local" ;
   }
}

}
?>

En el siguiente enlace, podrás descargar un ejemplo funcionando.

Nota: Para entender todo esto mejor, recomendamos leer el Manual de Codeigniter de DesarrolloWeb.com, que nos ayudará a la correcta configuración de nuestro sitio.

Algunas notas adicionales para poder seguir estos ejemplos:

Ya que nuestra dirección local es 127.0.0.0 y no tiene ningún sentido averiguarla en este caso, el ejemplo actual no correrá en pruebas con servidores locales http://localhost/

Es importante señalar que el GeoLiteCity.dat actualmente es de 11MB, así que no sería una sana costumbre llamar a la funciones de nuestra Librería ('timezone'); en todos nuestro controladores (ya que cada llamada es una apertura a dicho archivo, con el consecuente consumo de memoria). Lo más conveniente sería colocarlo en algún controlador al cual sepamos que el visitante accederá y luego almacenarlo en una variable de sesión, o guardarlo en una base de datos para nuestras estadísticas.

En todo caso, para hacerlo funcionar en nuestro controlador escogido, debemos agregar la declaración en el parent:

$this->load->library('timezone');

Y la llamada en nuestra function get_country_code_by_ip devolverá el pais destino:

$Llamada=$this->timezone->get_country_code_by_ip($this->input->ip_address());

De una manera similar, también tendremos disponibles las funciones get_country_code_by_city(), que devolverá la ciudad, o get_region_by_ip() que devolverá la región.

Espero que podáis sacar todo el provecho posible al determinar desde qué parte del mundo es visitada vuestra página.

Heisler Palma

Programador autodidacta, músico e investigador de la mente.

Manual