Problema
Tengo un formulario que, cuando se envía, ejecutará un código básico para procesar la información enviada e insertarla en una base de datos para mostrarla en un sitio web de notificaciones. Además, tengo una lista de personas que se han registrado para recibir estas notificaciones por correo electrónico y mensaje SMS. Esta lista es trivial como el momento (solo empuja alrededor de 150), sin embargo, es suficiente para que se tarde más de un minuto en recorrer toda la tabla de suscriptores y enviar más de 150 correos electrónicos. (Los correos electrónicos se envían individualmente según lo solicitado por los administradores del sistema de nuestro servidor de correo electrónico debido a las políticas de correo electrónico masivo).
Durante este tiempo, la persona que publicó la alerta se sentará en la última página del formulario durante casi un minuto sin ningún refuerzo positivo de que se está publicando su notificación. Esto conduce a otros problemas potenciales, todos los que tienen posibles soluciones que creo que no son ideales.
Primero, el cartel puede pensar que el servidor está retrasado y hacer clic en el botón 'Enviar' nuevamente, lo que hace que el script comience de nuevo o se ejecute dos veces. Podría resolver esto usando JavaScript para deshabilitar el botón y reemplazar el texto para decir algo como 'Procesando ...', sin embargo, esto es menos que ideal porque el usuario seguirá atascado en la página durante la ejecución del script. (Además, si JavaScript está deshabilitado, este problema aún existe).
En segundo lugar, es posible que el autor cierre la pestaña o el navegador antes de tiempo después de enviar el formulario. La secuencia de comandos seguirá ejecutándose en el servidor hasta que intente volver a escribir en el navegador, sin embargo, si el usuario navega a cualquier página dentro de nuestro dominio (mientras la secuencia de comandos aún se está ejecutando), el navegador se cuelga cargando la página hasta que finaliza la secuencia de comandos. . (Esto solo sucede cuando se cierra una pestaña o ventana del navegador y no toda la aplicación del navegador). Aún así, esto no es lo ideal.
(Posible) Solución
He decidido que quiero dividir la parte de "correo electrónico" del script en un archivo separado al que puedo llamar después de que se haya publicado la notificación. Originalmente pensé en poner esto en la página de confirmación después de que la notificación se haya publicado correctamente. Sin embargo, el usuario no sabrá que este script se está ejecutando y las anomalías no serán evidentes para él; Este script no puede fallar.
Pero, ¿y si puedo ejecutar este script como proceso en segundo plano? Entonces, mi pregunta es la siguiente: ¿Cómo puedo ejecutar un script PHP para activarlo como un servicio en segundo plano y ejecutarlo de manera completamente independiente de lo que el usuario haya hecho en el nivel del formulario?
EDITAR: Esto no se puede cron'ed. Debe ejecutarse en el instante en que se envía el formulario. Estas son notificaciones de alta prioridad. Además, los administradores del sistema que ejecutan nuestros servidores no permiten que los crons se ejecuten con una frecuencia superior a 5 minutos.
exec()
pero nunca probé esto.
ajax
e inserto sleep()
con intervalo de tiempo dentro del bucle (uso foreach en mi caso) para ejecutar el proceso en segundo plano. Funciona perfectamente en mi servidor. No estoy seguro de los demás. También estoy agregando ignore_user_abort()
y set_time_limit()
(con el tiempo de finalización calculado) antes del ciclo para asegurarme de que el servidor que uso no detenga el script, incluso según mi prueba, el script completando la tarea sin ignore_user_abort()
y set_time_limit()
.
gearman
con php para lidiar con tareas en segundo plano. Es perfecto para escalar si se encuentra con un gran procesamiento y cargas pesadas. Deberías echarle un vistazo.