Usuarios activos con PHP
Calculamos de una forma sencilla el número de visitantes presentes en nuestro sitio.
06/12/01 - En nuestro manual de PHP abordamos en su momento el uso de sesiones y dimos algún ejemplo práctico en el que este tipo de variables pueden ser utilizadas para dar a nuestro sitio un aspecto más dinámico.
Muchos de vosotros habéis podido ver en ciertos sitios un contador de usuarios que se encuentran en ese momento navegando por las mismas páginas que vosotros. Si os habéis fijado bien, habréis podido observar que, para la mayoría de los casos (sino la totalidad), el sitio en cuestión esta programado con ASP como lenguaje de servidor.
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:
<?
////////////////////////////////////////////
//USUARIOS ACTIVOS
//Calcula el numero de usuarios activos
////////////////////////////////////////////
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
pagina 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...
Seguir navegando a partir aquí:
+ 1 manual relacionado
+ 1 categoria relacionada
+ 13 comentarios (Añadir)
| Autoría, licencia y acciones sobre este artículo |
|
Informe de Rubén Alvarez*
Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.
* Para consultas técnicas utilizar la lista de correo.
|
Manuales relacionados con este artículo
Categorias relacionadas
A través de las categorías de nuestro directorio se pueden encontrar otro tipo de recursos relacionados con este artículo:
+ Entrar en
Scripts en PHP
Comentarios de los visitantes
|
Los comentarios de los visitantes son para ampliar la información del artículo. Cualquiera puede participar.
|
| Se muestran 13 comentarios revisados |
Comentario de Alex
29/3/04
Hola!
Ante todo decir que aunq lo q voy a decir no es en favor del script, me parece que esta muy bien,tanto este como la web en si,
y q seguro nos esta ayudando a mas de uno.
Pero mi duda es: Si el script no hace un borrado de la tabla cuando un usuario abandona la pagina, no nos estaria dando una informacion erronea?? Quiero decir, si yo me conecto y a los 5 minutos cierro el navegador, drante los siguientes 19 minutos el script aun me estaria contando como "usuario activo".
Que hay q añadirle al script para controlar esa situacion??
Comentario de Francisco
30/4/04
Hola perdona por la pregunta tonta que voy hacer, no se mucho de php es mas estoy leyendo algunos manuales para comprender y aprender, el problema es que no se como hacer que se vea el resultado, ya que creo la tabla y pongo el codigo con los datos de mi base de datos y demas pero no se muestran los resultados, como debo hacerlo? un saludo
Comentario de Jhean
28/5/04
cada vez que corro el script me da el siguiente error
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/webcindario/shogoki/usuario.php on line 39
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/webcindario/shogoki/usuario.php on line 49
Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in /home/webcindario/shogoki/usuario.php on line 52
usuarios conectados:
Comentario de erick
13/1/05
Tu ejemplo me ha agradado pero tengo una duda cuando guardas los datos de IP en la tabla, ¿que pasa cuando 1 usuario utiliza un proxy? la IP es la misma y pueden estar conectados varios usuarios. O simplemente cuando 2 usuarios distintos se conecten de la misma PC.
GRACIAS.. Espero que se pueda solucionar mi duda
Comentario de Samuell
02/6/05
Hola que tal estoy iniciando en el mundo del php y vi tu script y me parecio interesente, pero cuando ya creo la base de datos y el codigo php a la hora de correrlo no me sale nada...
Creo que es por esto:
active_users = usuarios_activos();
O tengo que hacer un include....
Porafavor ayudame....
Samuell
Comentario de LUCIANO
25/7/05
lo ke se debe hacer como dice el script es agregar al final de nuestra function
la llamada a esa funcion sino nunca se va a correr
function USUARIOS_ACTIVOS()
{
...
echo $usuarios;
}
//llamada a la funcion
$active_users=USUARIOS_ACTIVOS
?>
Comentario de erunoy
18/8/05
Tienes que hacer un refresh de las sesiones para que muestre solo lo real
Comentario de shen
04/9/05
tengo el mismo inconveniente que Jhean podrian decir que es lo que falla
Comentario de storm
15/9/05
Lo mismo que Jhean,
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/webcindario/mundovirtual/index.php on line 33
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/webcindario/mundovirtual/index.php on line 38
Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in /home/webcindario/mundovirtual/index.php on line 39
esto a que puede ser debido ??
Comentario de deempalme
04/1/06
aqui hice unas modificaciones para que no muestre la cantidad si no los usuarios que estan conectados, espero que les sirva:
Esta parte tiene que estar al principio de los codigos php:
<?php
if(session_start()==""){
session_start();
}
$hostname_deempalme = "localhost";
$database_deempalme = "basededatos";
$username_deempalme = "usuario";
$password_deempalme = "contraseña";
$deempalme = mysql_pconnect($hostname_deempalme, $username_deempalme, $password_deempalme) or trigger_error(mysql_error(),E_USER_ERROR);
?>
este codigo pos donde quieras:
<?
$ip = $_SESSION['Nombre de la session'];
$ahora = time();
mysql_select_db($database_deempalme, $deempalme);
$limite = $ahora-24*60;
$ssql = "delete from control_ip where fecha < ".$limite;
mysql_query($ssql);
$ssql = "select ip, fecha from control_ip where ip = '$ip'";
$result = mysql_query($ssql);
if (mysql_num_rows($result) != 0) $ssql = "update control_ip set fecha = ".$ahora." where ip = '$ip'";
else $ssql = "insert into control_ip (ip, fecha) values ('$ip', $ahora)";
mysql_query($ssql);
$query_usuarios_act = "SELECT * FROM control_ip ORDER BY fecha ASC";
$usuarios_act = mysql_query($query_usuarios_act, $deempalme) or die(mysql_error());
$row_usuarios_act = mysql_fetch_assoc($usuarios_act);
$totalRows_usuarios_act = mysql_num_rows($usuarios_act);
?>
esta es para mostrar los usuarios pegala en cualquier parte de la pagina:
<?php do { ?>
<?php echo $row_usuarios_act['ip'].", "; ?>
<?php } while ($row_usuarios_act = mysql_fetch_assoc($usuarios_act)); ?>
Comentario de franchu
10/10/06
No me mola nada, necesito hacer esto para mi web pero esta manera no me ha gustado. Cuando idee algo mejor ya lo pondre aki. Saludos.
Comentario de franchu
10/10/06
Bueno pues en un rato ya he encontrado una manera mucho mejor para realizar esta tarea y sin los inconvenientes ke puede haber cuando muchos usuarios comparten ip (cibers, hermanos...). Se supone ke keremos contar los usuarios activos en una web cuyo usuarios estan registrados, pues añadimos un campo mas en la tabla de usuarios ke sea "conectado" true o false.
Cuando se conectan lo ponemos a true, cuando desconecta a false. Y si keremos saber cuantos hay conectados hacemos un select count where conectado=true y punto.
Ahora me imagino ke nadie lo hace asi porke esta el problema de ke cuando un usuario cierra la ventana sin desloguearse antes por lo ke su estado kedaria a conectado=true.
Usando el evento unload del body se puede captar esto y podria hacerse abrir otra ventana donde ejecutar el codigo php para cambiar en BBDD a false, pero habra problemas si el usuario tiene desactivado ventanas emergentes y kedaria feo abrir otra ventana. Por lo ke la solucion es AJAX, gracias a esta tecnologia podremos ejecutar codigo php en la misma ventana solo cuando nosotros keramos, ke sera en el unload (al cerrar la ventana).
PD: El unico problema ke puede haber es ke al usuario se le vaya la luz...y kedara eternamente conectado=true si no vuelve a entrar, aunke se podria solucionar añadiendo ademas a este sistema lo ke dice en este manual.
La solucion de un timeout no me gusta porke si alguien conecta y se desconecta en 1 segundo, sigue conectado hasta ke pase el timeout y esto no es real.
Para cualkier duda eh_ke_si@hotmail.com xD
Comentario de djferry
10/2/07
Yo lo hice asi i tb me va, lo ice con una tabla eso lo pongo justo antes del ;?> final
$active_users = usuarios_activos();
echo "
<style type='text/css'>
<!--
.Estilo1 {
font-family: 'Arial Black', Arial;
font-size: 12px;
color: #FFFF00;
}
-->
</style>
<style type='text/css'>
<!--
.Estilo1 {
font-family: 'Arial Black', Arial;
color: #FFFF00;
}
-->
</style><table width='91' border='0' cellpadding='0' cellspacing='0'>
<!--DWLayoutTable-->
<tr>
<td width='91' height='80' valign='top'>
<table width='140' border='0' cellpadding='0' cellspacing='0'>
<!--DWLayoutTable-->
<tr>
<td width='140' height='23' valign='top'><span class='Estilo1'>Usuarios </span></td>
</tr>
<tr>
<td height='52' valign='top'><span class='Estilo1'>Hay ".$active_users." corcher@s</span></td>
</tr>
</table> ";
?>
Ir arriba