Introducción
Hay mucha gente a la que le gusta poner contadores en sus páginas web para mostrar la cantidad de visitas que ha tenido la página o el sitio en general.
Pero para poder poner un contador de esa manera debes de asegurarte de un par de cosas:
- 1. Debes de asegurarte de que puedes ejecutar CGI's en tu servidor.
- 2. Es necesario que tengas SSI, de otra manera no vas a poder.
Si estas seguro que tienes lo necesario entonces continuemos con el tutorial.
Primeros Pasos
Lo que vamos a hacer es un CGI que guarde el useragent de quien entro a visitar la página, después vamos a contar la cantidad de visitas que tenemos en ese momento, y finalmente vamos a desplegar el total.
Para hacer esto necesitamos el CGI y el archivo de texto en el que vamos a escribir los datos.
Mis Variables
Lo primero que vamos a hacer es inicializar la variable con el nombre del archivo que queremos escribir:
my $archivo = "visitas.txt";
Ahora, si alguna ves leiste el tutorial acerca de flock() que hay en el sitio, has de saber que es muy importante usarlo para evitar archivos corruptos. Pero como el flock() no es soportado por window vamos a inicializar una variable para saber si queremos usar flock.
my $usar_flock = 1; #poner en 0 si es windows
La siguiente variable que debemos de incializar es la que va a contener el identificador del navegador de la persona que esta viendo la página en ese momento:
my $user_agent = $ENV{'HTTP_USER_AGENT'};
Listo todas las variables que necesitamos inicializar ya estan disponibles.
Escribir, leer y desplegar
Nuestar primera acción es escribir el nuevo indentificador dentro del archivo:
open(FILE, ">>$archivo"); #abrir el archivo para escritura
flock(FILE, 2) if $usar_flock; #usar flock() si disponible
print FILE "$user_agent\n"; #escribir nueva entrada
close(FILE); #cerrar archivo
Listo, ya escribimos la nueva entrada, ahora lo que vamos a hacer es abrir el archivo y leer el número de lineas dentro de él:
open(FILE, "$archivo");
flock(FILE, 1) if $usar_flock;
my $visitas_totales = my @lineas = <FILE>; #leer lineas totales
close(FILE);
Listo ya escribimos la nueva entrada y leímos todas las visitas totales, ahora vamos a desplegar las visitas totales.
Si recuerdas en el tutorial de despliegue de HTML vimos que es necesario avisar que el contenido que sigue es código HTML, y eso lo hacemos con la siguiente linea:
print "Content-type: text/html\n\n";
Ya después de esta linea escribimos nuestro código HTML:
print "<b>Visitas totales:</b> $visitas_totales\n";
Muy bien ya tenemos nuestro CGI listo, ahora vamos a ver como lo ejecutamos desde nuestro HTML.
Los SSI
SSI son las siglas de "Server Side Includes", esto significa más o menos "cosas incluidas desde el servidor".
Dentro de los SSI que se pueden usar estan el "execute cgi" e "include virtual", normalmente cualquiera debe de funcionar para ejecutar cgis pero esto cambia dependiendo del sistema.
Entonces todo lo que hay que hacer es abrir nuestro .shtml e incluir donde queramos que se depliegue la linea del CGI cualquiera de las siguientes lineas:
<!--#include virtual="/ruta/al/contador.cgi"-->
<!--#exec cgi="/ruta/al/contador.cgi"-->
NOTA: Normalmente los SSI no se puden ejecutar desde los archivos con extensión .htm o .html, sino en HTMLs con extension .shtml. Si tienes duda preguntale al administrador de tu servicio de alojamiento.
Ya que hiciste todo esto debes de poner ejecutar tu contador sin ningun problema, y aparte vas a poder abrir el archivo de "visitas.txt" para ver que tipo de usuarios de visita.
Código Final
#!/usr/bin/perl -w
use strict;
my $archivo = "visitas.txt";
my $usar_flock = 1; #poner en 0 si es windows
my $user_agent = $ENV{'HTTP_USER_AGENT'};
open(FILE, ">>$archivo"); #abrir el archivo para escritura
flock(FILE, 2) if $usar_flock; #usar flock() si disponible
print FILE "$user_agent\n"; #escribir nueva entrada
close(FILE); #cerrar archivo
open(FILE, "$archivo");
flock(FILE, 1) if $usar_flock;
my $visitas_totales = my @lineas = <FILE>; #leer lineas totales
close(FILE);
print "Content-type: text/html\n\n";
print "<b>Visitas totales:</b> $visitas_totales\n";
exit(1);