Cron no se considera una mala práctica. Básicamente necesita un mecanismo de votación. Cualquier sistema asincrónico tiene un mecanismo de sondeo constante y liviano que sigue verificando si se produjo algún evento y llama a la actividad respectiva para procesar el evento.
Ahora en tu caso. Configura un cron para cada minuto. Ejecute una consulta para que coincida con todas las filas que coinciden con la hora actual … Asegúrese de que sus tiempos no tengan segundos porque su cron se ejecutará cada minuto. Lo más importante es indexar la columna que contiene el tiempo … Esto le devolverá todos los resultados requeridos de la base de datos en milisegundos. Luego solo procese estos resultados para enviar el mensaje.
Incluso si usa algún otro mecanismo para hacerlo, eventualmente lo hará con la misma lógica.
Editar: Agregar a mi respuesta para explicar.
No tiene que configurar varios crons. Debe configurar solo un cron que se ejecuta cada minuto.
Suponiendo que tiene las siguientes estructuras de tabla
Tabla de usuarios:
- ¿Qué es WAFS y cómo funciona WAFS (seguridad de firewall de aplicaciones web)?
- ¿Cuáles son algunas buenas ideas para un bot web?
- ¿Cuáles son las tecnologías utilizadas para hacer una aplicación web de realidad aumentada?
- ¿Es perceptivo crear una aplicación web en Ruby (marco de Rails)? ¿Cuáles son los pros y los contras?
- ¿Han fallado los widgets web del W3C?
id | nombre | apellido | correo electrónico
1 andy luton | [correo electrónico protegido]
2 juan doe | [correo electrónico protegido]
3 alguien más | [correo electrónico protegido]
Tabla de notas:
id | user_id | nota | hora
1 2 compre leche 2015: 03: 25 14:22:00
2 3 ir al gimnasio 2015: 03: 25 14:22:00
2 3 Algo 2015: 03: 25 20:15:00
Cada minuto este cron ejecuta la siguiente consulta
SELECCIONE users.firstname, users.email, notes.note FROM users INNER JOIN notes en user.id = notes.user_id WHERE time = CURRENT_TIME
Puede obtener la hora actual de PHP, pero asegúrese de establecer los segundos en 00.
Esta consulta le dará todos los resultados para los cuales debe enviarse un correo electrónico.
Ahora envíe los correos electrónicos:
foreach ($ resultados como $ fila)
{
// Enviar correo electrónico a $ fila [‘correo electrónico’] con cuerpo como $ fila [‘nota’]
}
NO debe usar la consulta exacta dada anteriormente. Debería obtener los resultados de la base de datos en fragmentos. Obtener todos los resultados de una sola vez es una mala práctica, ya que puede tener miles de filas que coincidan con los criterios y es muy posible que se quede sin memoria y enfrente cientos de problemas.