Contando visitantes activos con PHP

Efectivamente, ASP permite una gestión más accesible de las sesiones por medio del famoso archivo global.asa. Esto no quiere decir sin embargo, que PHP es incapaz de realizar el mismo tipo de tareas sino que, más bien, hemos de trabajar un poco más para conseguirlas. En efecto, todos los lenguajes tienen sus pros y sus contras y, en este caso particular, ASP resulta más versátil aunque hay que admitir que, con su versión 4, PHP ha mejorado mucho en todo lo que respecta al tratamiento de sesiones.

Aquí os mostramos una forma sencilla de contabilizar los usuarios activos de vuestro sitio usando para ese propósito una tabla. Dentro de dicha tabla, iremos almacenando los distintos números IP de los visitantes de nuestro sitio y la hora y fecha en la que el visitante ha ejecutado por ultima vez el script.

Asimismo, la tabla ha de ir borrando progresivamente las sesiones que no hayan sido renovadas en un tiempo que nosotros consideremos límite. Nosotros hemos fijado dicho límite en 24 minutos que es el tiempo máximo tomado por defecto por PHP para suprimir los datos de una sesión. Para modificar este tiempo de vida máxima de una sesión puede hacerse en el php.ini a partir del parámetro session.gc_maxlifetime donde expresaremos dicho plazo en segundos. Ojo, este tiempo máximo es restaurado a su valor inicial cada vez que el usuario realiza una petición al servidor, esto quiere decir que un visitante podrá navegar cuanto tiempo quiera por el sitio guardando la misma sesión siempre y cuando no se quede más de 24 minutos sin realizar ningún tipo de acción.

Para el correcto funcionamiento del script, es necesario antes de nada crear una tabla en nuestra base de datos. Esta sentencia SQL puede ayudaros en la tarea:

CREATE TABLE control_ip ( ip VARCHAR(15) NOT NULL, fecha INT(14) UNSIGNED NOT NULL, INDEX (ip) );

Como veis, el campo ip, que almacena el número IP del visitante, está indexado. Esto nos permitirá una selección rápida. En contrapartida, como todo campo indexado, su tamaño en memoria será doblado lo cual no tiene mucha importancia ya que la tabla tendrá un número de registros bastante limitado. Lo importante en efecto es que el script se ejecute rápidamente sin consumir demasiados recursos del servidor, sobretodo teniendo en cuenta que se trata de un código que será sistemáticamente ejecutado en cada una de las páginas del sitio.

Pasemos a continuación a mostrar el script que utilizaremos:

<?
function usuarios_activos()
{
   //permitimos el uso de la variable portadora del numero ip en nuestra funcion
   global $REMOTE_ADDR;

   //asignamos un nombre memotecnico a la variable
   $ip = $REMOTE_ADDR;
   //definimos el momento actual
   $ahora = time();

   //conectamos a la base de datos
   //Usad vuestros propios parametros!!
   $conn = mysql_connect($host,$user,$password);
   mysql_select_db($db,$conn);

   //actualizamos la tabla
   //borrando los registros de las ip inactivas (24 minutos)
   $limite = $ahora-24*60;
   $ssql = "delete from control_ip where fecha < ".$limite;
   mysql_query($ssql);

   //miramos si el ip del visitante existe en nuestra tabla
   $ssql = "select ip, fecha from control_ip where ip = ‘$ip’";
   $result = mysql_query($ssql);

   //si existe actualizamos el campo fecha
   if (mysql_num_rows($result) != 0) $ssql = "update control_ip set fecha = ".$ahora." where ip = ‘$ip’";
   //si no existe insertamos el registro correspondiente a la nueva sesion
   else $ssql = "insert into control_ip (ip, fecha) values (‘$ip’, $ahora)";

   //ejecutamos la sentencia sql
   mysql_query($ssql);

   //calculamos el numero de sesiones
   $ssql = "select ip from control_ip";
   $result = mysql_query($ssql);
   $usuarios = mysql_num_rows($result);

   //liberamos memoria
   mysql_free_result($result);

   //devolvemos el resultado
   return $usuarios;
}
?>

Podéis observar, como viene siendo norma, que el script es expresado en forma de función. Después de definir la IP y el momento en el que el script está siendo ejecutado, pasamos a interaccionar con la base de datos. Dentro de este proceso, podemos distinguir distintas fases:

  • Conexión con la base de datos
  • Barrido de la tabla para eliminar los registros obsoletos.
  • Inserción o actualización de un registro dependiendo de si el visitante es nuevo o no.
  • Cómputo del número de registros de la tabla
  • La función finaliza liberando el espacio de memoria utilizado en sus consultas y enviando el resultado del cálculo efectuado.

    En líneas generales el script es de fácil comprensión. Puede que alguna de las funciones empleadas os sea desconocida. Si es así, acudid al la página oficial de PHP donde podréis encontrar detalles en cuanto a su empleo.

    Para sacar el valor proporcionado por la función a nuestro script principal tendremos que realizar una llamada clásica del tipo:

    $active_users = usuarios_activos();

    He aquí en definitiva un script sencillo que puede dar a vuestro sitio una imagen un poco más dinámica. Además, podéis utilizarlo y mejorarlo para crear vuestro propio sistema de estadísticas internas. Eso os lo dejamos a vosotros…

    Deja un comentario