Tema: Trafico
Ver Mensaje Individual
  #3 (permalink)  
Antiguo 20/08/2003, 06:31
leonardop
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 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