5 minutos después de que ocurriera una acción de usuario específica, necesito cambiar algunos datos en mi base de datos. Hasta ahora he programado en mi servidor de inicio y he usado MySQL Events para lograr esto, que funcionó perfectamente. Pero mi proveedor actual donde ahora alojo mi sitio web restringe el uso de MySQL Events.

Ahora tengo que encontrar una alternativa para mysql Events.

Pensé en ejecutar un script php que cambie los datos en segundo plano usando exec("php script.php &> /dev/null &"), que en realidad funciona (al menos en mi servidor doméstico) pero que también está restringido por mi proveedor.

Ahora estoy realmente sin ideas y necesito tu ayuda, ¿cómo puedo hacer el truco?

¡Gracias!

Christof

EDITAR: Cronjobs no hace el truco en mi caso, ya que tengo que ejecutar el script solo si se ha producido la acción específica del usuario.

1
AnUser1 11 ago. 2016 a las 19:14

1 respuesta

Por lo general, la mejor manera de manejar este tipo de elemento de base de datos de archivos de suspenso es utilizar una estrategia de tiempo efectivo. Lo mejor de esta estrategia es esto: no depende de la precisión del tiempo de sus eventos, cronjobs o lo que sea.

No dijiste qué debe suceder con tus datos cinco minutos después de la acción del usuario, así que tendré que adivinar.

Suponga que la operación es eliminar una fila de table_a e insertar una fila en table_b. En ese caso, agregaría una columna DATETIME o TIMESTAMP effective_until a table_a y otra columna effective_after a table_b.

Cuando ocurre la acción del usuario, haces algo como

 UPDATE table_a 
    SET effective_until = NOW() + INTERVAL 5 MINUTE
  WHERE id='whatever';

Y

 INSERT INTO table_b  (id, data, effective_after)
               VALUES (whatever, whatelse, NOW() + INTERVAL 5 MINUTE);

Luego, más tarde, cada vez que usa table_a, dice

 SELECT ... FROM table_a WHERE (effective_until <= NOW() OR effective_until IS NULL) ;

Y cuando usas table_b dices

 SELECT ... FROM table_a WHERE effective_after > NOW();

Una vez al día, o una vez a la semana, o lo que sea, puede eliminar las cosas muertas de table_a con algo como esto.

  DELETE FROM table_a WHERE effective_until <= NOW();

El truco consiste en marcar las filas con marcas de tiempo, en lugar de depender de operaciones cronometradas con precisión. Mucho más robusto y confiable. Resistente cuando fallan los cronjobs durante todo un fin de semana. Además, es compatible con servicios de alojamiento baratos y bases de datos que no cooperan, los cuales el mundo tiene en abundancia.

1
O. Jones 11 ago. 2016 a las 17:36