jueves, 4 de diciembre de 2008

Video Tutorial - Contador de usuarios online con PHP


En este caso quiero seguir con la tana de contaores, en esta oportunia decidi implementar un contador de usuarios online, es decir, este contador nos puede decir con relativa certeza cuantos usuarios se encuentran navegando en nuestra página actualmente.

La implementacion de este contador decidi hacerla de dos maneras, con archivos de texto o con una base de datos MySQL. A todos los que lean este articulo, que no es mucha gente :( , les recomiendo ampliamente la opcion de la base de datos, pero como a veces es costoso alojar una pagina web en un servidor con MySQL, les dejo el ultimo recurso de implementar el contador con archivos de texto.

Para implementar el contador vamos a cumplir con dos premisas principales:

  1. Borrar usuarios con registro obsoleto es nuestra primera accion, si ha pasado mucho tiempo sin dar señales de vida, entonces debemos eliminarlo de la lista hasta que vuelva a aparecer.
  2. Registrar o actualizar usuario, todos los clientes que dan señales de vida son incluidos automaticamente en el archivo de texto o base de datos (Si el usuario ya existia entonces solo se actualiza la fecha).



Contador con archivos de texto
Primero vamos a implementar el contador con archivos de texto, vamos a crear una pagina llamada uactivos.php que va a contener el siguiente código:

Código uactivos.php

<?php


// Usuarios activos con PHP sin utilizar bases de datos


//IP del usuario

$id = $_SERVER [ 'REMOTE_ADDR' ];


// Tiempo en segundos en que expira la sesión.

$fin_session = 600;


//Archivo que contiene los usuarios y tiempo

$archivo = "usuarios.txt";


//Si el archivo no existe lo creo

if(!file_exists($archivo))

{

$a = fopen($archivo, "w");

fclose($a);

}


$arr = file($archivo);

$contenido = $id.":".time()." ";


for ( $i = 0 ; $i < sizeof($arr) ; $i++ )

{

$tmp = explode(":",$arr[$i]);

if (( $tmp[0] != $id ) && (( time() - $tmp[1] ) < $fin_session ))

{

$contenido .= $id.":".time()." ";

}


}

$fp = fopen($archivo,"w");

fputs($fp,$contenido);

fclose($fp);

$array = file($archivo);


$USUARIOS_ACTIVOS = count($array);


?>

<table width="74%" border="0" align="center" cellpadding="0" cellspacing="0">

<tr>

<td><p>&nbsp;</p>

<p>Usuarios activos (online) con PHP.</p></td>

</tr>

<tr>

<td height="170" align="center" valign="top"><p align="left"><br />

<br />

<br />

<h1><?php echo "Hay ".$USUARIOS_ACTIVOS." usuarios activos"; ?></h1>

</p>

<p align="left">&nbsp;</p>

<p align="left"></p>

<p align="center">Alejandro Sánchez - <a href="http://internetdeveloping.blogspot.com/">http://internetdeveloping.blogspot.com/</a></p></td>

</tr>

</table>

Lo primero que hacemos es almacenar en una variable $ip la direccion del host (usuario) que esta accediendo a nuestra página, esto lo hacemos con una variable de servido que ya viene predefinida en PHP, $_SERVER [ 'REMOTE_ADDR' ]. Luego procedemos a decidir cuanto tiempo queremos que pase un usuario sin dar señales de vida (realizando acciones dentro de la pagina) para que lo consideremos como offline o inactivo, el tiempo que consideremos no debe ser ni muy grande ni muy pequeño, y por supuesto que va ajustado al tipo de pagina que nosotros estemos desarrollando ya que hay paginas donde los usuarios deben obligatoriamente estar actuando dentro de la pagina mientras hay otras paginas donde hay grandes lecturas o tutoriales que no requieren e mucha interaccion con el usuario. En este ejemplo decidi poner 600 segundos como un simple numero que me parecio sensato.

El siguiente paso es verificar si el archivo donde queremos almacenar los atos de los usuarios existe o si debemos crearlo, con la funcion file_exists() de PHP podemos averiguar si el archivo especificao existe. Esto lo hacemos con el siguiente coigo:

if(!file_exists($archivo))
{
$a = fopen($archivo, "w");
fclose($a);
}
La funcion file() nos permite leer todo el contenido de un archivo y almacenar cada line en una casilla diferente de un arreglo. En este caso, una nueva linea en el archivo representa un nuevo usuario en la pagina, por lo que esta funcion nos cae como anillo al dedo.

$arr = file($archivo);
Una vez que tenemos toda la informacion en el arreglo procedemos a recorrerlo realizano una division que transforma la lina de texto original en dos sub cadenas, el operador ":" es el encargado de marcar la separacion entre la primera y la segunda cadena de caracteres.

$tmp = explode(":",$arr[$i]);
El arreglo $tmp ahora contiene las dos subcadenas que representan lo sigueinte, la primera representa el IP de el usuario y la segunda el instante en el tiempo en que se registro, debemos verificar que no se ha cumplido su tiempo establecido para dar señales de vida, ya que de lo contrario debemos eliminarlo del archivo de texto.

Ahora procedemos a actualizar el archivo con los nuevos IP de usuarios y a imprimir pon pantalla la cantidad de usuarios en linea.

Contador con BD MySQL
Ahora procedemos a crear el contador con base de datos, la logica planteada sera practicamente la misma, son los detalles de carpinteria los que voy a explicar:

Script para la creacion de la tabla usuarios_activos.php
CREATE TABLE `usuarios_activos` (
`id` bigint(20) NOT NULL auto_increment,
`ip` varchar(11) NOT NULL,
`time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `ip` (`ip`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3

Como en este caso estamos trabajando con una base de datos vamos a utilizar las funciones mysql_query, mysql_num_row y mysql_fetch_row.

Luego de registrar el IP y el tiempo en que expira la sesion, el siguiente paso es borrar de la BD todos los registros que tienen un tiempo mayor al tiempo de expiracion (desde que se registraron). Asi garantizamos que no hay ningun usuario obsoleto y podemos proceder a registrar el usuario actual (si es que el mismo no pertenede ya a la tabla de usuarios online), si el ya pertenece entonces le actualizo su hora de registro para que pueda ser considerado mas tiempo como usuario activo.

UActivo.php

<?php

require('conexion.php');

// Usuarios activos con PHP sin utilizar bases de datos


//IP del usuario

$id = $_SERVER [ 'REMOTE_ADDR' ];


// Tiempo en segundos en que expira la sesión.

$fin_session = 600;


mysql_query("DELETE FROM usuarios_activos WHERE time_to_sec(NOW())-time_to_sec(time) > ".$fin_session);


$results = mysql_query("SELECT * FROM usuarios_activos WHERE ip='".$id."'");


if(mysql_num_rows($results)==0)

{

mysql_query("INSERT INTO usuarios_activos VALUES('','".$id."',NOW())");


}


$results = mysql_query("SELECT count(*) FROM usuarios_activos WHERE ip='".$id."'");

$row = mysql_fetch_row($results);


?>

<table width="74%" border="0" align="center" cellpadding="0" cellspacing="0">

<tr>

<td><p>&nbsp;</p>

<p>Hola mundo en PHP, el codigo en este lenguaje debe incluirse entre las etiquetas &lt;?php ?&gt; y para imprimir por pantalla debe usarse la funcion &quot;echo&quot; seguida de la variable, numero o string que se desea imprimir.</p></td>

</tr>

<tr>

<td height="170" align="center" valign="top"><p align="center"><br />

<br />

<br />

<span class="style6"><h1><?php echo "Hay ".$row[0]." usuarios activos"; ?></h1></span></p>

<p align="left">&nbsp;</p>

<p align="left"></p>

<p align="center">Alejandro Sánchez - http://internetdeveloping.blogspot.com/</p></td>

</tr>

</table>

Aqui les dejo un video tutorial sobre el tutorial que acabo de explicar (o intentar explicar), espero que les aclare mejor sobre el tema, cualquier pregunta no duden en preguntarme escribiendome a mi correo aalejo@gmail.com o por este mismo blog.
Parte 1 (Archivo de texto)

Parte 2 (MySQL)


6 comentarios:

  1. Hola me parece muy bueno el articulo y le entiendo perfectamente bien solo que tengo una duda y un problema tambien desde hace tiempo.

    Al usar $SERVER['REMOTE_ADDR'];
    saca la ip solo saca 1 ip por conexion de usuario, es decir si existen 3 maquinas conectadas desde el mismo lugar a todas las reconoce con la misma ip
    y solo reconoce a 1 usuario como conectado en vez de a 3.

    Entonces la cosa es como hacerle para que realmente te de la ip de cada uno de esos usuarios

    ResponderEliminar
  2. compadre sabes ago todo tal cual y no funciona

    ResponderEliminar
  3. compadre aqui te dejo mi correo jbec.maet@gmail.com
    ya que todo el codigo que tienes no me resulta

    ResponderEliminar
  4. que bien Alejandro tus tutos han sido de mucha ayuda psala bien

    ResponderEliminar
  5. no registra la ip en base de datos???

    ResponderEliminar
  6. nesecito un contador pero para que cuente los clicks a una imagen

    ResponderEliminar