
20/08/2003, 06:31
|
| | Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 21 años, 7 meses Puntos: 1 | |
(continuación)
Código:
<?php
/* Modulo de estadisticas - `estadisticas.php'
* ===========================================
*
* En este archivo se incluyen una serie de funciones utiles para la
* generacion automatica de estadisticas de un numero de paginas.
*
* En terminos generales, todo lo que debe hacer es:
*
* - Incluir este archivo desde cada pagina que desea controlar, y
* hacer un llamado a la funcion estadisticas_registrar(). Por
* ejemplo:
*
* <?php
* require_once 'estadisticas.php';
* estadisticas_registrar ();
* ?>
*
* - Incluir este archivo, y hacer un llamado a estadisticas_mostrar()
* desde la pagina en donde desea incluir el reporte de estadisticas
* totales. Ejemplo:
*
* <?php
* require_once 'estadisticas.php';
* estadisticas_mostrar ();
* ?>
*
* Para usos mas especificos, consulte cada una de las funciones que
* se presentan a continuacion.
*
* Nota:
* Este modulo fue creado inicialmente usando archivos de texto
* planos para almacenar de forma legible la informacion de las
* estadisticas. Este detalle implica que su instalacion y uso es
* relativamente simple, y se cuenta con la ventaja adicional de
* disponer de los datos en un formato simple.
*
* Sin embargo, quiere decir tambien que el rendimiento de estas
* funciones es proporcional a la ejecucion de las computaciones
* involucradas en la gestion de informacion en el sistema de
* archivos. Quizas quiera adaptarlo a sus gustos y necesidades. Tal
* vez modificarlo para que respalde los datos en una base de datos
* relacional para mayor escabilidad y robustez. Seria un bonito
* ejercicio... :) */
/*** Definicion de valores de configuracion ***/
// Nombre del archivo en donde se almacenan las datos por defecto.
define ('ESTADISTICAS_ARCHIVO', 'estadisticas.txt');
// Nombre del servidor local en donde se ubican las paginas web
define ('ESTADISTICAS_SERVIDOR', 'localhost');
/*** Funciones del modulo ***/
// Funcion que almacena una serie de datos generados en este modulo en
// un archivo determinado. Recibe el nombre del archivo en donde se
// deben almacenar los datos, y una matriz asociativa con la
// informacion de las estadisticas.
// Esta funcion elimina cualquier contenido que podria tener
// previamente el archivo.
function estadisticas_guardar ($nombre_archivo, $datos)
{
$da = fopen ($nombre_archivo, 'w'); // Descriptor de archivo
if (! $da)
return;
if (! flock ($da, LOCK_EX)) {
trigger_error ('No pudo crearse un bloqueo exclusivo en el ' .
'archivo de estadisticas.');
return;
}
while (list ($estadistica, $valores) = each ($datos)) {
fwrite ($da, "\n[" . $estadistica . "]\n");
while (list ($ruta, $valor) = each ($valores))
fwrite ($da, "$ruta = $valor\n");
}
flock ($da, LOCK_UN);
fclose ($da);
}
// Funcion que carga desde un archivo determinado los datos de
// estadisticas generadas por este modulo. Retorna una matriz
// asociativa con los valores cargados desde el archivo
function estadisticas_leer ($nombre_archivo)
{
$datos = array ();
if (! is_file($nombre_archivo))
return $datos;
$da = fopen ($nombre_archivo, 'r'); // Descriptor de archivo
if (! $da)
return $datos;
if (! flock ($da, LOCK_SH)) {
trigger_error ('No pudo crearse un bloqueo de lectura compartida ' .
'en el archivo de estadisticas.');
return $datos;
}
$categoria = false;
while (! feof ($da)) {
$linea = trim (fgets ($da, 1024));
if (preg_match ('/^\\[(.*)\\]/', $linea, $m))
$categoria = $m[1];
elseif (preg_match ('/\\S/', $linea) && $categoria !== false) {
list ($var, $val) = preg_split ('/\\s*=\\s*/', $linea, 2);
$datos[$categoria][$var] = $val;
}
}
flock ($da, LOCK_UN);
fclose ($da);
return $datos;
}
// Funcion que carga desde el archivo de estadisticas por defecto los
// datos almacenados hasta el momento, y los despliega en orden.
function estadisticas_mostrar ()
{
$datos = estadisticas_leer (ESTADISTICAS_ARCHIVO);
// El formato en que se imprime esta informacion dificilmente
// podria ser mas arbitrario. Por favor, sientase libre de
// adaptarlo.
while (list ($estadistica, $valores) = each ($datos)) {
echo <<<FIN_CABECERA
<h3>$estadistica</h3>
<table border="1" cellspacing="0" cellpadding="7">
FIN_CABECERA;
while (list ($clave, $valor) = each ($valores)) {
echo "<tr><td>$clave</td><td>$valor</td></tr>\n";
}
echo "</table>\n";
}
}
// Funcion que registra en el archivo de estadisticas por defecto los
// datos de la peticion web actual. Basta con hacer un llamado a esta
// funcion desde cada pagina que se desea incluir en las estadisticas
// para generar los datos totales de un sitio web.
function estadisticas_registrar ()
{
// Ignorar peticiones generadas por este propio modulo
if (isset ($_SERVER['HTTP_USER_AGENT']) and
$_SERVER['HTTP_USER_AGENT'] == 'Estadisticas-PHP')
return;
$est = estadisticas_leer (ESTADISTICAS_ARCHIVO);
// La ruta al script actual servira de clave para almacenar varias
// estadisticas
$clave = $_SERVER['PHP_SELF'];
// Estadistica de visitas
if (isset ($est['Visitas'][$clave]))
$est['Visitas'][$clave]++;
else
$est['Visitas'][$clave] = 1;
// Estadistica de flujo de datos. Por favor lea las anotaciones
// que hay sobre el uso de esta funcion mas adelante.
$flujo_actual = longitud_de_pagina (ESTADISTICAS_SERVIDOR, $clave);
if ($flujo_actual) {
if (isset ($est['Bytes transmitidos'][$clave]))
$est['Bytes transmitidos'][$clave] += $flujo_actual;
else
$est['Bytes transmitidos'][$clave] = $flujo_actual;
}
// Estadistica de ultima visita
$est['Ultima visita'][$clave] = date ('r');
// Estadistica de IP del visitante
if (isset ($_SERVER['REMOTE_ADDR'])) {
$clave = $_SERVER['REMOTE_ADDR'];
if (isset ($est['Visitas por IP'][$clave]))
$est['Visitas por IP'][$clave]++;
else
$est['Visitas por IP'][$clave] = 1;
}
// Estadistica de `referer' (pagina de donde proviene el usuario)
if (isset ($_SERVER['HTTP_REFERER'])) {
$clave = $_SERVER['HTTP_REFERER'];
if (isset ($est['Referers'][$clave]))
$est['Referers'][$clave]++;
else
$est['Referers'][$clave] = 1;
}
// Agregue su estadistica propia aqui! :)
estadisticas_guardar (ESTADISTICAS_ARCHIVO, $est);
}
// Funcion que realiza peticiones a un servidor web determinado, en
// busca del tamanyo de un documento dado. Inicialmente, intenta
// conocer el tamanyo del documento haciendo una peticion mediante el
// metodo HEAD, y buscando el valor de la cabecera `Content-Length'
// devuelta por el servidor. Si el servidor no devuelve esta cabecera,
// realiza otra consulta mas (esta vez por el metodo GET) y lee toda
// la respuesta del servidor para asi calcular su tamanyo final.
// Recibe el nombre del servidor al cual debe conectarse
// (p. ej. 'mi-servidor.com', 'localhost') y la ruta al documento
// deseado (p. ej. '/', '/directorio/documento.htm').
// Devuelve el tamanyo en bytes del documento web, o FALSE en caso de
// fallo.
// Atencion!!! En caso de que no lo haya notado, esta funcion puede
// resultar altamente costosa en recursos computacionales si no es
// usada con cuidado. Si piensa hacer uso de esta funcion en un
// servidor en produccion en donde podrian efectuarse un numero
// considerable de llamados a la misma, mantengase alerta, y en caso
// de detectar efectos negativos de rendimiento, considere la idea de
// abandonar el uso de esta funcion del todo.
function longitud_de_pagina ($servidor, $ruta)
{
$bytes = false;
$socket = fsockopen ($servidor, 80);
if (! $socket)
return false;
fwrite ($socket, "HEAD $ruta HTTP/1.0\n");
fwrite ($socket, "Accept-Encoding: identity\n");
fwrite ($socket, "User-Agent: Estadisticas-PHP\n\n");
while (! feof ($socket)) {
$linea = fgets ($socket, 1024);
if (preg_match ('/^Content-Length:\\s*(\\d+)/i', $linea, $m)) {
$bytes = $m[1];
break;
}
}
fclose ($socket);
if (! $bytes) {
$socket = fsockopen ($servidor, 80);
if (! $socket)
return false;
fwrite ($socket, "GET $ruta HTTP/1.0\n");
fwrite ($socket, "User-Agent: Estadisticas-PHP\n\n");
$bufer = '';
while (! feof ($socket))
$bufer .= fread ($socket, 4096);
fclose ($socket);
$bufer = preg_replace ('/^.*?(\\r?\\n){2}/s', '', $bufer);
$bytes = strlen ($bufer);
}
return $bytes;
}
?>
Cita: Hay tanto que aprender y tan poco tiempo No podría estar más de acuerdo... :)
Un cordial saludo |