php - Non-Stop cronjob
mysql duplicates (4)
Gino, puedes hacer algo como cronjobs si tienes acceso a tu php.ini en el servidor. Si puede establecer el valor de max_execution_time en cero, puede crear sus propias cronjobs que se ejecutan cada segundo. Lo que necesitas es algo como esto en tu php.ini:
max_execution_time = 0
o configúralo como un script de tiempo de ejecución en tus códigos PHP:
ini_set("max_execution_time",0);
La siguiente función que necesita es la función sleep () en PHP. Esta función pondrá retraso entre tus operaciones. Puedes usarlo como sleep(10);
. Para obtener más información acerca de esta función, eche un vistazo a este enlace .
Recibí un nuevo requerimiento del negocio sobre datos / estadísticas en "tiempo real" . Quieren mostrar cómo nuestro sistema funciona en tiempo real.
No estoy seguro de cómo hacerlo, pero aquí están mis pensamientos:
No creo que sea posible obtener los datos cada segundo porque cronjob se ejecuta al menos cada minuto. Entonces, sin decirles, dije SÍ que es posible.
Ahora mi problema es: ¿cómo puedo ejecutar un cronjob que obtenga estadísticas en nuestros sitios (ventas, impresiones, cpc, etc.)?
Ejemplo:
Desde las 9h01 AM hasta las 9h02 AM tengo:
- 41 visitas en el producto 1
- 1 orden
- Clic de 8 referencias de clientes
- 2 agregado a la lista de deseos
Desde las 9h02 AM hasta las 9h03 AM tengo:
- 57 visitas en el producto 1
- Orden 0
- 13 referencias cliqueadas de clientes
- 0 agregado a la lista de deseos
Total:
- 98 visitas en el producto 1
- 1 orden
- 21 clics de referencia de clientes
- 2 agregado a la lista de deseos
¿Cómo puedo asegurarme de que no calcularé duplicados si por alguna razón la base de datos es lenta y no procesa la información a tiempo?
Gracias
Editar: La empresa tiene 200 empleados en 3 estados diferentes, que consta de personal de ventas, analista de negocios, técnico, contable y ejecutivo, y estas personas pueden leer estos informes.
En el último año contratamos a 20 empleados, por lo que crecerá un poco. Para los datos de tráfico, es difícil decir exactamente cuántos datos obtenemos por minuto. La estimación es de aproximadamente 2.5k a 10k por minuto.
Acabamos de pedir 3 PowerEdge R510 (Intel® Xeon® E5503, 2.0Ghz, 4M Cache, 12GB de memoria (3x4GB), 1333MHz Dual Rank, 4 x 300GB 15K RPM Serial-Attach SCSI 6Gbps RAID 5).
Guarde en la base de datos la marca de tiempo de los registros y evalúe los datos según este (para mysql http://dev.mysql.com/doc/refman/5.0/en/timestamp.html )
Esto es lo que recomiendo basado en sus servidores / empleados / datos, si estos servidores son. Debido a que está utilizando 1 servidor (y 1 copia de seguridad), la capacidad de su disco debería ser suficiente por un tiempo a menos que desee archivar datos completos en este servidor. Los datos pueden crecer rápidamente y creo que para aumentar la capacidad o archivar los datos en otro lugar.
Ahora, debido a que hay mucha gente que puede solicitar datos de informes, la idea principal es recuperar datos lo más rápido posible para asegurarse de no bloquear registros (especialmente si usa tablas myisam - bloqueo de tabla vs innodb que tiene nivel de fila cierre).
Use su índice (único si lo necesita) sabiamente y almacene sus datos de la manera más eficiente posible usando la marca de tiempo.
Lo que también puede hacer es resumir sus datos, lo que puede simplificar sus consultas. Aunque, no es una práctica común en las bases de datos ya que no respeta las formas normales. Puede obtener un gran rendimiento, pero es difícil de mantener.
Para ser honesto, un cron que se ejecuta cada minuto está bien ya que tiene el tiempo cuando guarda el registro, pero es posible obtener datos cada segundo. Recomiendo asegurarse de que cuando obtenga un registro, marque este registro como "procesado" o algún otro estado para que no tome este registro dos veces.
Ahora, cuando resumas tus datos, asegúrate de optimizar tus consultas y también puedes verificar qué generará la explicación y luego tomar una decisión.
EDITAR: Resumir datos (que no respeta la normalización de la base de datos) le proporcionará un gran rendimiento, ya que solo consulta registros sin utilizar funciones de agregado y tiene tablas de unión que utilizan cláusula where mínima.
Ejemplo:
98 views on product 1
1 order
21 referral click from clients
2 added to wishlist
puede ser:
SELECT
views, orders, referral, whishlist
FROM
summarize_stats_20111201 /* daily table for example */
WHERE
`time` between 1322791200 /*2011-12-01 21:00:00*/ AND 1322791260 /*2011-12-01 21:01:00*/;
views
tiene la cantidad total de vistas, en este ejemplo 98
orders
tiene la cantidad total de pedidos, en este ejemplo 1
referral
tiene la cantidad total de referencia, en este ejemplo 21
wishlist
tiene la cantidad total de lista de deseos, en este ejemplo 2
Estos son datos calculados en una tabla de resumen (por eso dije "no respeta la normalización de la base de datos" porque nunca se calculan los datos en un RDBMS) pero si necesita datos al instante, esta es una forma de hacerlo.
EDIT 2: Aquí hay un ejemplo de mantener esta solución:
Tienes un cronjob que mantiene tablas. Su trabajo es crear la mesa para el día siguiente o lo que necesite.
// in php
$date = date(''Ymd'', strtotime(''+1 day'')); // for daily table
$sql = ''CREATE TABLE IF NOT EXISTS the_database.summarize_stats_" . $date . ";
Entonces, cuando insertes, asegúrate de tener el nombre correcto de la tabla y usar ON DUPLICATE KEY
// in php
$sql = ''INSERT INTO TABLE summarize_stats_20111201 SET /* all the fields you need */ ON DUPLICATE KEY views = views + 1;
por ejemplo, si desea aumentar la vista
Lo que también olvido es que si necesita consultar 1 semana de datos, tendrá que crear una tabla de fusión . De esta forma puedes hacer algo como:
SELECT
views, orders, referral, whishlist
FROM
summarize_stats_2011 /* yearly merge table for example */
WHERE
`time` between 1322272800 /*2011-11-25 21:00:00*/ AND 1322791260 /*2011-12-01 21:01:00*/;
De esta forma, no tiene que UNION ALL
toneladas de consultas.
Esto puede sonar extraño, pero ¿por qué no usa Google Analytics para este tipo de tareas de seguimiento? Con la nueva "beta en vivo"
Y recuperando los datos usando su API y realizando todos los requisitos sofisticados que la administración pueda requerir.
Además, js y google se encargarán de la mayor parte de la carga.
editar: Mi verdadero punto es por qué no intentas usar el js ( woopra o el tuyo) para juntar los clics, eventos en el frente y almacenar todas las estadísticas en otra base de datos, no creo mezclar OLAP y OLTP es una buena idea en cualquier servidor de producción. Espero que tenga sentido.