Script PHP para implementar contador de usuarios online y páginas vistas

06 de junio de 2011
Valoración del artículo:
Presentación de un script PHP, gratuito y listo para usar, que permite mostrar en nuestro sitio los usuarios online conectados al mismo tiempo y las páginas vistas que lleva hoy la web.
En el presente artículo ofrezco una solución rápida a todo el que quiera implementar en un sitio web un mensaje, para que el visitante pueda conocer un par de datos del tráfico de la página. Todo de una manera gratuita, con licencia GPL, y de forma sencilla, ya que no necesitamos configurar elementos como base de datos.

Este script, creará un mensaje en cualquier sitio de la página en el que se verán los usuarios que están visitando el sitio en un momento dado. Por otro lado, informará de las páginas vistas que se han producido durante el día de hoy.

Características y diferencias de este script PHP con otros de Internet

En los sitios web de la Asociación educativa ASOCAE, con la que la colaboro a nivel de webmaster aficionado, eché en falta un contador de visitas y páginas vistas, al margen de los habituales servicios de estadísticas, que seguro podría obtener en variadas empresas que ofrecen ese servicio, incluso gratuitamente.

En estos casos las necesidades eran más sencillas: consistía en un simple contador de los usuarios únicos que se encuentran en línea, y un contador que pudiese mostrar el número de páginas vistas durante el día y durante el mes. Y todo esto, sin florituras gráficas, mostrando los resultados con caracteres de texto y como mucho acompañados de un par de pequeños iconos identificativos.

Eso permitiría a los usuarios que visitan la web, hacer de un solo vistazo una evaluación de la popularidad del sitio, en base al número de usuarios y visualizaciones que se van registrando.

No obstante, nada de lo que encontré en Internet cumplía con estos requisitos al 100%. En unos casos se requerían base de datos, algo que me parecía excesivo para las pretensiones del contador; en otros casos se abusaba en el código de las llamadas al servidor, consumiendo excesivos recursos; y en ningún caso encontré algo que sirviese en conjunto a las tres necesidades planteadas (aunque sí abundaban muchos códigos por separado). Así que me dedique a tomar para mi diseño lo mejor de cada uno de los scripts que iba encontrando por la red.

Tras un periodo de pruebas de un mes en las webs y blogs de ASOCAE que considero satisfactorio, he decidido liberalo y ponerlo a disposición pública, mediante licencia GPL, para que lo uséis si os gusta, o lo modifiquéis según vuestras necesidades si os place.

Implementación del contador de usuarios en línea y páginas vistas

El contador es simple, en formato texto, pero rápido y funcional. En la siguiente imagen puede observarse el texto que produce el contador, una vez insertado en la página.

El script está escrito en lenguaje PHP y para almacenar los datos contabilizados utiliza archivos de texto en lugar de base de datos. Son en realidad tres contadores en uno. El primero de ellos muestra los usuarios únicos que están visitando la web (se recurre a la captura de las IPS's y el momento exacto en segundos en que accedieron), el segundo y tercer contador muestra las páginas vistas por día y por mes, respectivamente. Al finalizar el día y/o el mes, se restauran a cero y comienzan de nuevo.

El script se aloja en el servidor dentro de una carpeta llamada "visitas" (abajo podéis acceder al enlace de la descarga). Tenéis que transferir al raíz del servidor la carpeta completa, y darle a ésta y todo su contenido permisos 777.

En el archivo para descarga, encontraréis una serie de archivos que podríais colocar en una carpeta llamada "visitas”. Contiene los siguientes archivos:

- usuarios.php (Script php que gestiona los usuarios únicos que están en linea)
contar_usuarios.dat (Archivo de texto donde se guardan los datos de los usuarios que están en línea)
- visitas.php (Script php que gestiona las visitas que se van recibiendo)
contar_dia.dat (Archivo de texto donde se guarda el número de visitas durante el día)
contar_mes.dat (Archivo de texto donde se guarda el número de visitas durante el mes)
- dia.dat (Archivo de texto donde se guarda el día de la fecha actual –del 1 al 31–)
- mes.dat (Archivo de texto donde se guarda el mes de la fecha actual –del 1 al 12–)
- logo_useronline.gif (icono de usuarios en línea)
- logo_visitas.gif (icono de las visualizaciones de página)

Importante: todos los archivos con extensión .dat, tienen que ser inicializados con el valor "0" (y sin que contenga ningún espacio en blanco). Editarlos previamente para comprobar que tienen ese valor, en caso contrario escribir en ellos un "0" y guardarlos antes de transferirlos al servidor.

Por ser de especial interés para entender el funcionamiento de los scripts (para el que le interese conocer los entresijos de la programación que he realizado), os dejos los códigos de los dos scripts principales (usuarios.php y visitas.php), con sus comentarios:

usuarios.php

<?php

//Obtenemos la IP del visitante y la hora actual.
$ip=$_SERVER['REMOTE_ADDR'];
$hora=time();
$existe=0;

//Tiempo que tardará en actualizarse el contador (60=1 minuto, 1800=media hora)
$sesion=$hora-1800;

$archivo="contar_usuarios.dat";
$ar=@file($archivo);

//Se abre el archivo de texto para eliminar ips expiradas y crear nuevo array con las vigentes.
//Se crea un buqle para recorrer el archivo y leer su contenido
foreach($ar as $pet){
$ele=explode(":",$pet);
$ai=trim($ele[1]);

if(trim($ele[1]) == $ip && trim($ele[0]) > $sesion)
{
$existe=1;
}
if(trim($ele[0]) > $sesion)
{
$array[]=implode(":",$ele);
}
}

//Se abre el archivo para guardar los datos nuevos.
//Se crea un buqle para recorrer el archivo y leer su contenido
$p=@fopen($archivo,"w+");
if($existe == 0){
$array[]=$hora.":".$ip."n";
}

foreach($array as $eoeo){
$grabar.=trim($eoeo)."n";
}

@fwrite($p,$grabar);
@fclose($p);

$con=@file($archivo);

//Se guarda en una variable el número de usuarios únicos visitando la web
$n_usuarios=count($con);

//Se muestran los datos formateados en color rojo
echo "<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1?>
</head>
<body STYLE='font-family: Arial, Helvetica, Sans Serif; font-size:12px;font-weight: bold;color:#FF0000?>
<div align='left'><img border='0? src='logo_useronline.gif'>
$n_usuarios usuarios en línea
</div>
</body>
</html>";

?>

visitas.php

<?php

//Se guardan en variables los nombres de archivo, día y mes
$fichcontmes = "contar_mes.dat";
$fichdia = "dia.dat";
$fichcontdia = "contar_dia.dat";
$fichmes = "mes.dat";
$arr=getdate();
$dia= $arr["mday"];
$mes= $arr["mon"];

//Se abre el archivo del día para leer su contenido. Si es no es el mismo, se añade el nuevo día.
//Si el día es el mismo, se suma 1 al contador
$abrir_dia = fopen($fichdia, "r+");
$nuevo_dia = fgets($abrir_dia, 255);
fclose($abrir_dia);
if ($nuevo_dia != $dia)
{
$undia_mas = fopen($fichdia, "w");
fputs($undia_mas, $dia);
fclose($undia_mas);
}

$visit_dia = fopen($fichcontdia, "r+");
$suma_dia = fgets($visit_dia, 255);
$suma_dia++;

//Si el dia del archivo no es el mismo del sistema, se pone el contador a cero
if ($nuevo_dia != $dia)
{
fclose($visit_dia);
$dia_acero = fopen($fichcontdia, "w");
fputs($dia_acero, "1?);
fclose($dia_acero);
}
else
{
fseek($visit_dia,SEEK_SET);
fputs($visit_dia, $suma_dia);
fclose($visit_dia);
}

//Este módulo es idéntico al del día de arriba, pero en este caso solo para el mes.
$abrir_mes = fopen($fichmes, "r+");
$nuevo_mes = fgets($abrir_mes, 255);
fclose($abrir_mes);
if ($nuevo_mes != $mes)
{
$unmes_mas = fopen($fichmes, "w");
fputs($unmes_mas, $mes);
fclose($unmes_mas);
}

$visit_mes = fopen($fichcontmes, "r+");
$suma_mes = fgets($visit_mes, 255);
$suma_mes++;
if ($nuevo_mes != $mes)
{
fclose($visit_mes);
$mes_acero = fopen($fichcontmes, "w");
fputs($mes_acero, "1?);
fclose($mes_acero);
}
else
{
fseek($visit_mes,SEEK_SET);
fputs($visit_mes, $suma_mes);
fclose($visit_mes);
}

//Se muestran los datos guardados formateados en color verde
echo "<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1?>
</head>
<body STYLE='font-family: Arial, Helvetica, Sans Serif; font-size:12px;font-weight: bold; color:#008000?>
<div align='left'><img border='0? src='logo_visitas.gif'>
Pág. vistas hoy: $suma_dia, Mes: $suma_mes
</div>
</body>
</html>";

?>

Para visualizar los datos utilizo dos IFRAME:

<IFRAME SRC='visitas/usuarios.php' SCROLLING='no' allowtransparency="true" NAME='I1? MARGINWIDTH='0? MARGINHEIGHT='0? WIDTH='150? HEIGHT='20? FRAMEBORDER='no'>
</IFRAME>
<IFRAME SRC='visitas/visitas.php' SCROLLING='no' allowtransparency="true" NAME='I1? MARGINWIDTH='0? MARGINHEIGHT='0? WIDTH='240? HEIGHT='20? FRAMEBORDER='no'>
</IFRAME>

El código de los IFRAME tenemos que insertarlos en todas las páginas que deseamos contabilizar, y situándolos allí donde nos interesa mostrar los resultados. Obviamente, si insertamos el código sólo en la página principal, será ésta la única página contabilizada.

Nota: cada desarrollador sabrá que método utilizar para que se contabilice el total de las páginas del sitio, ejemplo, insertando los IFRAME en un archivo único y llamándolo mediante un "include" PHP desde todas las páginas del sitio con algo como

<?php include("archivoquecontieneeliframe.php"); ?>

Podéis ver este contador funcionando normalmente en las webs y blogs de ASOCAE, por ejemplo http://www.natureduca.com/

Podéis descargar el script completo en formato zip, en el siguiente enlace.

Podéis contactar conmigo en caso de necesitar ayuda en la implementación.

Compartir en redes sociales

Comentarios
Fueron enviados 10 comentarios al artículo
4 comentarios no revisados
6 comentarios revisados:
Sobre script Contador Usuarios o line
Por: Amigo
09/6/2011
Me parece genial esto, pero no logre que Paginas Vistay y el Mes, dejen de contarme cada refrescada de imagen, Usuarios en linea funciona ok, pero los otros dos me van sumando cada vez que accedo a la pagina.
No se nada de programacion, pero esto se podria mejorar, es decir que paginas vista hoy y mes no me sumen caa vez que accedo, pues es la misma IP..
Grcias
Sobre script Contador Usuarios online
09/6/2011
Hola Amigo:

Por lo que describes, el script está funcionando correctamente. Te explico:

Los usuarios en línea tienen que contabilizarse como visitantes únicos, por tanto sólo se cuenta una vez a un mismo usuario, si abandona la web y regresa transcurrido un tiempo (que se configura en el script) entonces se vuelve a contabilizar de nuevo.

Sin embargo, en las páginas vistas (por día o por mes) lo que interesa es saber cuántas veces se abre una página, por tanto hay que ignorar siempre la IP del visitante. Dado que un mismo usuario puede abrir varias páginas en su navegación por la web, obviamente hay que contabilizarlas todas si deseamos llevar un control correcto de páginas vistas.
El hecho de que refresques la página y se contabilice como vista, es lógico, a todos los efectos cada refresco es una apertura de página.

Por otro lado, el primer día que instalas el contador observarás que aparecen las mismas cantidades en día y en mes. Esto también es correcto, pues hasta que no pasen de las 12 de la noche el contador por días no se pondrá a cero. Por su parte, el contador por mes seguirá sumando las visitas totalizadas del día anterior hasta comenzar el mes siguiente, en que también se pondrá a cero para iniciar una nueva cuenta.

Si tienes más dudas con mucho gusto te las solvento.

Un saludo.
me tira el sig. error
Por: savior
16/6/2011
me gusta tu scrpit sin embargo me tira el sig. error.. sabes algo al respecto?

Notice: Undefined variable: grabar in C:htdocs estvisitasusuarios.php on line 42
codigo de visitas?
Por: Edilson
25/6/2011
como eu faso para colocar ete codigo em uma pagian html?

qual pagina eu coloco o codigo
<?php include("pagina"); ?>
como eu faço?
Por: Edilson
27/6/2011
eu consegui colocar ana pagina, só coloquei os usuarios online, mas no servidor só aparece 1 usuario online mesmo tem 2 online, como eu etualiso eles par ver quando tem 2 user online? tenho que criar algum banco de dados?
obrigado!

hax_sx
Ayuda con este script !.
26/12/2011
bueno no se porque me da la impresion de que alguna funsion usada solo corre bajo servidores apache !, porque lo pruevo en local y todo bien, pero cuando lo subo al servidor para hcer pruevas, siempre aparece nada mas 1 usuario online !.

tambien me tira el error mencionado ! en un comentarios que hicieron anteriormente, sobre la linea de codigo siguiente !!.

$grabar .= trim($eoeo). " ";

espero me puedan orientar !.

Manuales relacionados
Categorias relacionadas
El autor
Abel Dominguez R.
Electrónico de comunicaciones / Funcionario del Estado
http://www.asocae.org


Lectura recomendada
Compra este libro en Agapea, la librería urgente a domicilio.
Últimas noticias
Donaciones
Si piensas que te hemos ayudado y merecemos tu apoyo económico...