Foros del Web » Programando para Internet » PHP »

Trafico

Estas en el tema de Trafico en el foro de PHP en Foros del Web. Hola a [email protected] Necesitaba saber si existe algun "script" en php que con el cual se pueda ver el "trafico" diario de un sitio para ...
  #1 (permalink)  
Antiguo 18/08/2003, 14:01
Avatar de Torus  
Fecha de Ingreso: enero-2002
Ubicación: Tú buscame y me encontraras
Mensajes: 413
Antigüedad: 15 años, 11 meses
Puntos: 0
Pregunta Trafico

Hola a [email protected]
Necesitaba saber si existe algun "script" en php que con el cual se pueda ver el "trafico" diario de un sitio para meterlo en una administracion.
Gracias
Un Saludo
__________________
Hay tanto que aprender y tan poco tiempo
  #2 (permalink)  
Antiguo 20/08/2003, 07:28
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 14 años, 5 meses
Puntos: 1
Hola mi amigo,

Es curioso, cuando leí tu mensaje, inicialmente pensé que no podría responder a tu inquietud puesto que la verdad no conozco, o no recuerdo haber visto scripts prefabricados en PHP que midieran el tráfico de un sitio.

Después pensé en responder preguntándote a qué te referías exactamente con `tráfico', ya que es un poco ambiguo el término. De hecho, y ya que lo menciono, permíteme explicarme.

Respecto al tema que propones, resulta que entran muchos factores en juego, y existe todo un rango de posibilidades a considerar cuando de tráfico de red se refiere (aun en el caso particular de las páginas web). Por ejemplo, puede que te interezca simplemente conocer el número de visitas que recibe una determinada página, algo como una especie de contador. O puede que te interese conocer la cantidad de bytes que transmite el servidor web cuando sirve cada página a los clientes. Podrías incluso entrar a considerar la cantidad de bytes que transmite el servidor web por efecto de servir archivos "auxiliares" (por ejemplo, contar el tráfico de las imágenes y demás archivos adicionales que pueden ser incluidos desde una página web). Incluso podríamos entrar a hablar del tráfico de red en capas más bajas: quizás estés interesado en consultar el flujo que pasa por el(los) dispositivo(s) de red de una máquina determinada. En cualquier caso, la respuesta depende bastante de qué es lo que tienes en mente.


Ahora bien, la idea central de tu mensaje permaneció dándome vueltas en la mente, y me llevó a pensar qué tipo de cosas serán las que podrías estar necesitando, y hasta qué punto pueden buscarse soluciones prácticas haciendo uso de PHP.

Esto me llevó a sentarme y escribir algunas líneas de código. Pero en la medida en que escribía algunos trozos de código, se me ocurría una idea más general, y más precisa de lo que podría construirse. En fin, después de implementar y re-implementar varias veces mis ideas, en principio confusas, decidí escribir un módulo de gestión de estadísticas, cosa que, me parece a mí, podría resultarte útil hasta cierto punto.

Siéntete libre de hacerme saber cualquier comentario, sugerencia y demás. Si necesitas que el módulo se comporte de alguna forma distinta, o implemente funcionalidades nuevas, es posible que con la ayuda de nuestros amigos que visitan este foro podamos ir modificando el código que a continuación presento, hasta llegar a algo más completo y útil para ti y por supuesto para cualquier persona.

De modo que, sin más preámbulo...

(continúa)
  #3 (permalink)  
Antiguo 20/08/2003, 07:31
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 14 años, 5 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
  #4 (permalink)  
Antiguo 20/08/2003, 09:00
Avatar de Torus  
Fecha de Ingreso: enero-2002
Ubicación: Tú buscame y me encontraras
Mensajes: 413
Antigüedad: 15 años, 11 meses
Puntos: 0
De acuerdo

Antes que nada, darte mi mayor agradecimiento por tu tiempo y tu forma de actuar ya que solo hace falta que alguien al que no conoces pida algo y te pongas a pensar
1º en lo que necesita
2º en como puedo solucionarlo
Definitivamente es un privilegio pertenecer a este foro.
1.000.000 de gracias
Bueno..... Lo que yo pretendo es que un cliente que esta en un servidor y a traves de su administracion pueda consultar el trafico que dia a dia generan sus paginas ya que tiene un tope y si se pasa tendra que pagar la diferencia.
Cuando me refiero a "trafico" es la cantidad de bytes, Kbytes,megas,etc. que se generan cada vez que hay una solicitud de una pagina y el servicio de esta.
Si la pagina tiene dos fotografias de 30 Kb y la pagina "pesa" 3Kb el total del servicio es la suma de estas 33Kb esto es lo que yo pretendia.
Aunque soy neofito en PHP sé que hay variables bien de PHP o de Apache que "guardan" esos datos, el problema es que no se que variables son y no se donde buscarlas.
Te doy las gracias por tu codigo que todavia no he utilizado por que al ver tu post pensé que lo primero tenia que contestarte por tu deferencia, pero lo probare y te comentaré.
Muchas gracias.
Un saludo cordial
__________________
Hay tanto que aprender y tan poco tiempo
  #5 (permalink)  
Antiguo 21/08/2003, 05:36
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 14 años, 5 meses
Puntos: 1
Hola Torus,

Gracias por tus comentarios. Respecto a la aclaración que haces de `tráfico', veo que te refieres a la transmisión total de datos (en bytes) que provoca un sitio web determinado. Esta es la razón principal por la que incluí la categoría de `flujo' en el módulo de estadísticas mencionado. Esta categoría aparece bajo el rótulo `Bytes transmitidos' en el archivo de estadísticas generado.

Ahora bien, veo que hay, por lo menos, dos limitaciones importantes en este tipo de enfoque. Por una parte, este algoritmo sólo se encarga de sumar los bytes generados por un solo documento web determinado, y no suma el tráfico de los archivos "auxiliares" (imágenes, etc.) En este sentido, podría modificarse cortamente el programa para que analizara el contenido de la página web inicial, en busca de etiquetas HTML que hicieran referencia a documentos externos (como <img>) y sumara también el flujo de bytes de esos archivos. Si te interesa, podríamos intentar una implementación sencilla de este modelo.

Por otro lado, hay que pensar que cuando se trata de generar estadísticas para fines económicos como el que mencionas (de los resultados de nuestra aplicación depende si cada cliente debe pagar o no recargos de servicio, por ejemplo) hay que ser en extremo cautelosos. Los cálculos de datos pueden fallar. A veces el servidor web puede generar datos inexactos. Algunas páginas podrían crear cabeceras HTTP que deliberadamente indiquen valores falsos sobre la cantidad de bytes que serán en últimas transimitidos por el servidor. Hay muchas variables involucradas y muchos puntos vulnerables a errores (voluntarios o involuntarios).

Personalmente creo que los recursos informáticos en este tipo de situaciones son sólo elementos útiles hasta cierto punto, que ofrecen información valiosa, pero que no debería confiarse en esta información ciega y completamente. En últimas pienso que debe ser una persona de quien dependan las acciones devidadas de los datos que una aplicación de este tipo genera. Es muy importante mantener las cosas en perspectiva y recaer en el sentido común en tanto se haga necesario.


Ahora bien. Ya que hablamos de exactitud y datos confiables, se me ocurre que hay al menos dos alternativas más para la generación de estadísticas de tráfico.
  • Podría recurrirse al uso de gestores y agentes del protocolo SNMP para consultar valores como el número de bytes que son transimitidos a través de un dispositivo de red. Este tipo de enfoque es usado con mucho éxito por piezas de software como mrtg.

    De hecho, no habría que descartar el uso de una aplicación como el mismo mrtg en lugar de crear nuestro propio agente/gestor de SNMP.
  • Otra alternativa, que requeriría de relativamente poco trabajo, es recurrir a los registros (logs) del servidor web para consultar el tráfico generado para cada página y sitio web dado.


Estoy tentado a escribir un pequeño programa en PHP que analice archivos de registro de servidores web, o incluso empezar a jugar con el protocolo SNMP, pero quisiera que me dijeras si realmente existe la necesidad real para tal tipo de aplicación. Además, aun no sé un par de detalles importantes: ¿sobre qué tipo de máquina (sistema operativo, arquitectura, etc.) trabajas? ¿qué servidor web usas?

Sinceramente encuentro muy interesante todo este asunto, solo deseo contribuir algo... :)

Un cordial saludo
  #6 (permalink)  
Antiguo 21/08/2003, 07:42
Avatar de Torus  
Fecha de Ingreso: enero-2002
Ubicación: Tú buscame y me encontraras
Mensajes: 413
Antigüedad: 15 años, 11 meses
Puntos: 0
Hola leonardop:
El tema es que he contratado un servidor Linux, Red Hat 7.2 - 7.3 donde apovechamos y a parte de confeccionar paginas web ofrecemos a nuestros clientes la posibilidad de hospedarse en este servidor.
En local las pruebas se hacen en windows xp y php 4.3.2 sobre apache apache 2.0.47
En la actualidad no ha surgido la inquietud del famoso script por que las paginas que teniamos no generaban demasiado trafico (5Gb es el tope por dominio ).
Pero en un futuro cercano tendremos que incluir una pagina con foro, chat, dunloads, etc.
En principio el cliente está de acuerdo con el pago del consumo que se exceda de los 5 Gb.
Pero lo que quiero es que todo esté de un modo transparente y que no tenga que fiarse solamente de mi palabra y pueda consultar periodicamente su consumo.
A mi en mi panel general me llega el computo total de trafico de todos los dominios juntos, he consultado con el servidor y no dispone de ese servicio personalizado.
Referente a que los datos no son exactos, estoy de acuerdo con tu posicion ya que las consultas a la base de datos y los archivos descargados se quedan fuera, Si fuese solo las consultas a la base de datos, lo que se perdiese, tampoco me preocuparia ya que estaria dispuesto a jugar entre un 10% a un 21% de error arriesgandome a perder dinero, pues como te comente no se trata de hacer negocio con el hosting si no dar un servicio al cliente.
Como desconozco el tema del protocolo SNMP he decidido bajar el mrtg-2.9.29.zip (por cierto hay un mirror en castellano ) y y trastear para ver si me entero de algo, en principio parece ser lo apropiado, pero ya te comentare.
He probado tu escrip y va Cañon, cuando tenga un poco de tiempo lo pondre bonito con acceso a una base de datos y todo eso.
Cuando lo termine te lo mando.
Saludos cordiales
__________________
Hay tanto que aprender y tan poco tiempo

Última edición por Torus; 21/08/2003 a las 07:45
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:26.