2011-06-08 15 views
5

Saludos, estoy desarrollando una aplicación web. Una parte permitirá a los usuarios programar un correo electrónico de "recordatorio" para que se les envíe a una hora determinada del día. Cuál es la mejor manera de lograr esto? Básicamente, todas las soluciones que he encontrado operan en un patrón de "sondeo" cuando lo que quiero es un patrón de "interrupción".¿La mejor manera de programar dinámicamente el correo electrónico de recordatorio? ¿Algo mejor que cron?

Aquí están algunas soluciones posibles Yo he llegado con:

  1. tiene un incendio cronjob cada minuto. La secuencia de comandos que se activa comprueba una base de datos para ver si hay correos electrónicos para enviar, si los hay, los envía, de lo contrario vuelve a dormirse. Un inconveniente con esto es que hay un poco de gastos generales incurridos cada minuto. Además, este puede no ser un sistema escalable, especialmente cuando la cantidad de usuarios es tan grande que puede llevar más de un minuto enviar todos los correos electrónicos.

  2. Igual que el n. ° 1, pero el trabajo solo se dispara cada 15 minutos. Esto es un poco más manejable, pero no perfecto, ya que restringe a los usuarios a los recordatorios en las marcas de 15 minutos, y aún incurre en un poco de sobrecarga cuando no hay correos electrónicos para enviar. No está mal, pero tampoco perfecto.

  3. Tenga PHP exec() un poco de código que altera dinámicamente crontab o programa un trabajo "at" en el Linux subyacente. Esto me daría la flexibilidad y el modelo de tipo "interrupción" que tanto anhelo, pero abriría un gran vacío de seguridad al permitir PHP ejecutar código de Linux. Por lo tanto, voy a seguir adelante y descartar este.

Entonces, ¿algo mejor que lo que se me ocurrió? ¿Tal vez una forma de programar el correo electrónico sin usar cron? Tengo mucha curiosidad por ver lo que ustedes tienen que decir sobre esto :).

+1

Incluso los desarrolladores de Postfix recomiendan utilizar trabajos cron para la programación de correo. Por cierto, nada de malo con el uso de 'exec' con cuidado. Es más probable que se exploten debido a los desbordamientos del búfer de PHP que a los comentarios de shell diligentes en otras partes de su código. – mario

+0

http://stackoverflow.com/questions/6278940/scheduling-a-regular-event-cron-cron-alternatives-including-celery. Parece similar a esta pregunta, ¿no? – Kizz

Respuesta

2

Utilice la primera variante.

puede tardar más de un minuto para enviar todos los correos electrónicos

  1. Verificar, si file_exists ('mailing.q'); Si aún existe, finalice la ejecución.
  2. crear el archivo mailing.q
  3. enviar correos electrónicos
  4. de desvinculación ("correo.q ');

Y no piense en la sobrecarga - no en este caso.

0

Hay un comando hostman que le permite llamar a una función en un momento específico. Eso debería hacer lo que quieras.


Esta fue mi sugerencia original:

¿Qué pasa con una combinación?

  1. Haga que un trabajo cron se ejecute una vez en < veces>.
  2. Haga que rellene un archivo con una marca de tiempo => que refleje si hay un correo electrónico antes de < hora actual> + < intervalo de tiempo>.
  3. Haga que un segundo cron se ejecute cada minuto, si la hora se encuentra en el archivo de lista de correo electrónico, luego ejecute el script de envío de correo electrónico.
+1

cron le permite ejecutar funciones en momentos específicos también, ¿no? – Jeff

2

No hay nada particularmente incorrecto con el uso de cron en las opciones n. ° 1 y n. ° 2, no sé qué tipo de aplicación está utilizando, pero puede no ser necesario que los usuarios puedan programar el minuto exacto. Incluso entonces, probablemente no sería un problema si su secuencia de comandos marca el estado del recordatorio como "pendiente" o tal, y cualquier instancia nueva del script solo enviará los que no estén "pendientes" o "enviados".

Puede usar Hudson o una aplicación similar que podría ayudar con la administración de scripts y le permitiría estar al tanto de las fallas, etc. Incluso puede enviar avisos cuando hay fallas. Es compatible con su propio sistema cron basado en Java.

Si la aplicación se vuelve grande, es posible que desee descargar este proceso a un servidor diferente de su servidor web. También es posible que desee buscar herramientas de terceros para enviar correo, si aún no está utilizando un servicio SMTP externo, y ver qué herramientas de integración podrían tener. Esto también debería mejorar las tasas de entrega, etc.

+0

+1 Por sugerir un servicio de correo externo. Los servicios de correo externo lo protegen de una lista negra accidental, que ocurre con más frecuencia de lo que usted pensaría, según mi amigo en marketing por correo electrónico ... – drkstr

3

Puede tener un script PHP que permanezca en ejecución. Cada intervalo establecido, consulta la base de datos para correos electrónicos que deben enviarse en el siguiente intervalo. Divide eso en una matriz con un grupo por cada minuto. Por lo tanto, si elige 15 minutos, tendría una matriz con 15 entradas, cada una de las cuales tiene todos los correos electrónicos que deben enviarse en ese momento.

Puede utilizar forking para dividir el proceso, una se encarga de enviar los correos electrónicos, la otra duerme hasta el próximo minuto y se divide de nuevo. Para escalar, puede bifurcar múltiples procesos y cada proceso maneja una cierta cantidad de correos electrónicos.

En pocas palabras, un proceso administra la cola y bifurca otros procesos para manejar el envío. Cuando la cola está "vacía", obtiene más. Puede tener un cron ejecutándose periódicamente para asegurarse de que el proceso no haya muerto.

1

No se debe confundir cola un correo electrónico para enviar y enviar realidad el correo.

Su servidor de correo puede necesitar fifteen minutes para enviar un solo correo electrónico. Pero solo necesito mail(1)0.036s para poner en cola un mensaje de correo electrónico para enviar.

E incluso si terminas con más de 1600 correos electrónicos para enviar por minuto (¡buen trabajo!) Podrías modificar tu código un poco para comenzar a enviar recordatorios de correo electrónico probabilísticamente varios minutos antes, en previsión de 'picos' - - digamos, mirando en su base de datos por cinco minutos para ver si hubo> 1000 correos electrónicos entregados, y comience a ponerlos en cola con 1/5 de probabilidad, 1/4 de probabilidad, 1/3 de probabilidad, 1/2 de probabilidad, luego haciendo cola restos.

Cuestiones relacionadas