> Manuales > Taller de PHP

Script PHP, gratuito y listo para usar que muestra un contador de los usuarios conectados al sitio web, los que están online mismo tiempo, y las páginas vistas que lleva hoy la web.

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

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 configurar un conjunto de permisos correcto, junto con el usuario dueño de los archivos alguno que Apache sea capaz de escribir.

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.

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"); ?>

Abel Dominguez R.

Electrónico de comunicaciones / Funcionario del Estado

Manual