2009-10-08 77 views
6

Quiero escribir un script de contador de visitas para realizar un seguimiento de visitas en imágenes en un sitio web y las direcciones IP de origen. Las impresiones son más de cientos de miles por día, por lo que los contadores se incrementarán muchas veces por segundo.Cómo escribir un contador de visitas eficiente para sitios web

Estoy buscando un método simple, autohospedado (php, scripts de python, etc.). Estaba pensando en usar MySQL para hacer un seguimiento de esto, pero supongo que hay una manera más eficiente. ¿Cuáles son los buenos métodos para mantener contadores?

Respuesta

-1

Bueno, si va por la ruta de PHP puede usar una base de datos SQLite, sin embargo, MySQL es una forma perfectamente razonable de almacenar esa información y normalmente (al menos de las que he visto) es cómo se hace.

Si no desea almacenar la dirección IP y cualquier otra información, un simple número en un archivo de texto podría funcionar.

+2

Soy un gran admirador de SQLite, y archivos de texto simples, pero ambos no son adecuados para esta tarea. Supongamos que hay más de un servidor, más de una imagen, más de un hit concurrente, etc. ... – Dustin

7

Un tema fascinante. Incrementar un contador, simple como puede ser, solo tiene como una transacción ... es decir, puede bloquear toda la base de datos por más tiempo del que tiene sentido! -) Puede ser fácilmente el cuello de botella de todo el sistema.

Si necesita recuentos exactos exactos pero no los necesita para actualizarse al instante, mi enfoque favorito es agregar la información contable a un registro (cambiando los registros con la frecuencia necesaria para fines de actualización de datos). Una vez que se cierra un registro (con miles de eventos contables), un script puede leerlo y actualizar todo lo que se necesita en una sola transacción, tal vez no sea intuitivo, pero mucho más rápido que miles de bloqueos individuales.

Luego hay contadores extremadamente rápidos que son solo estadísticamente precisos, pero como no dice que tal imprecisión sea aceptable, no los voy a explicar con más profundidad.

+0

La mayoría de los servidores web proporcionan este registro de todos modos. Ver mi respuesta – middus

+0

@middus, claro, pero mi punto es que (incluso si lo que le importa no está registrado, o si está en un host que no le da acceso a los registros), puede contar a través de los registros propios dedicados (también puede ser mucho más rápido procesar dichos registros que los generales, ya que puede adaptarlos a las necesidades de conteo, puede actualizar el DB bastante a menudo cerrando los registros de conteo con mucha más frecuencia que los generales, etc.). –

+0

Sí, por supuesto, tienes razón. Sin embargo, en este caso específico, cuando se trata de imágenes, debe canalizar todo el tráfico a través de un script de algún tipo, que es bastante grande. (Al menos no puedo ver una mejor opción). – middus

2

Hay dos maneras muy fáciles:

  1. analizarlo fuera de sus registros web en el lote.
  2. Ejecuta los hits a través de beanstalkd o gearmand y haz que un trabajador haga las cosas difíciles de forma controlada.

La opción 1 funciona con herramientas disponibles en el mercado. La opción 2 requiere solo un poco de programación, pero te brinda algo más cercano a las actualizaciones en tiempo real sin hacerte caer cuando el tráfico aumenta (como lo encontrarás en tu caso directo de mysql).

0

No estoy seguro si es tu callejón, pero AppEngine es una plataforma bastante agradable para construir. Algunos códigos de muestra que puede usar para construir un contador usando su DataStore y sus transacciones se describen aquí: http://code.google.com/appengine/docs/python/datastore/transactions.html.

+0

Tratamos de almacenar muchos contadores en el motor de la aplicación, y resulta costoso en tiempo de CPU. Es decir, cuesta $$. – dfrankow

1

Si la precisión es importante, puede hacerlo un poco más lento con MySql ... crear una tabla HEAP/Memory para almacenar sus valores de contador. Estas tablas en memoria son increíblemente rápidas. Puede escribir los datos en una tabla normal a intervalos.

Según las ideas del motor de la aplicación, puede utilizar Memcache como una tienda temporal para su contador. Incrementar un contador de memcache es más rápido que usar las tablas de montón de MySql (creo). Una vez cada cinco o diez segundos, puede leer el contador de Memcache y escribir ese número en su base de datos.

4

Puede tomar el registro de acceso de su servidor web (Apache: access.log) y evaluarlo una y otra vez (cronjob) en caso de que no necesite tener los datos a mano en el momento exacto en que alguien visita su sitio.

Por lo general, access.log se genera de todos modos y contiene el recurso solicitado, así como la hora, fecha e IP del usuario. De esta manera, no tiene que enrutar todo tráfico a través de un script php. Magra, máquina de contar media.

0

Puede usar Redis - es un almacenamiento de clave-valor muy rápido con soporte para incrementos atómicos. Si surge la necesidad, los datos de recuentos se pueden dividir fácilmente entre varios servidores.

0

He hecho algo muy similar, en una escala similar (varios servidores, cientos de dominios, varios miles de visitas por hora) y el análisis de archivos de registro definitivamente era el camino a seguir. (También verificaba las tasas de aciertos, las ponderaba por tipo de archivo y colocaba en la lista negra direcciones IP en el cortafuegos si realizaban demasiadas solicitudes; su objetivo era bloquear automáticamente los bots defectuosos, no ser simplemente un contador, sino que el recuento era un pieza esencial.)

Ningún impacto en el proceso del servidor web en sí mismo, ya que no está haciendo ningún trabajo adicional allí, y usted puede fácilmente publicar recuentos actualizados periódicamente inyectándolos en la base de datos del sitio cada minuto/5 minutos/100 aciertos/lo que sea sin tener que bloquear la fila/tabla/base de datos relevante (dependiendo del mecanismo de bloqueo en uso) en cada golpe.

+0

Esto suena increíble, ¿algún consejo sobre cómo comenzar a crear esto? ¿Se puede hacer con PHP? – swt83

+0

@ swt83: Usé Perl, pero tengo entendido que PHP se ha extendido para que se ejecute en entornos que no sean web, por lo que debería ser posible. Para un contador simple, básicamente solo se trata de configurar un trabajo cron para que se ejecute cada cierto tiempo, verifique el acceso de largo para nuevos hits (registre la posición de fin de archivo cada vez para que la próxima ejecución pueda continuar desde donde el último lo dejó en lugar de volver a procesar el registro completo) y procesarlo/resumirlo como prefiera. Si lo quiere en tiempo real, escríbalo como un monitor tipo 'tail -f' que lee del archivo tal como está escrito (solo tenga cuidado con la rotación de registros). –

2

Sin lugar a dudas, Redis es perfecto para este problema. Requiere aproximadamente un minuto para instalarse e instalarse, admite incrementos atómicos, es increíblemente rápido, tiene librerías de cliente para python y php (y muchos otros lenguajes), es duradero (instantáneas, diario, replicación).

Almacene cada contador en su propia clave. Entonces simplemente

INCR key 
Cuestiones relacionadas