La descarga de la función de secuencia de comandos para después de la respuesta: los métodos y las mejores prácticas?

StackOverflow https://stackoverflow.com/questions/1549453

Pregunta

En primer lugar,

la puesta en marcha:

Tengo un guión que ejecuta varias tareas después de un usuario pulsa el botón "Subir" que envía el guión de los datos que necesita. Ahora, esta parte es actualmente obligatorio, no tenemos la opción en este punto de cortar la carga y extraer de una fuente viva.

Esta sección intencionalmente largo aliento para hacer un punto. Saltar hacia delante si no le gusta que

En este momento los datos se analiza desde una fuente muy a la moda usando expresiones regulares, a continuación, desglosado en una matriz. A continuación, comprueba la base de datos para los datos que ya están en el intervalo de fechas de los datos cargados. Si los intervalos de fechas de datos no existen ya en la base de datos, se inserta el éxito y salidas de datos para el usuario (también hay algunos controles de seguridad, validación fuente de datos y validación básica de subida) ... Si existe los datos, la secuencia de comandos a continuación, obtiene los datos que ya están en la base de datos, encuentra las diferencias entre los dos conjuntos, borra los datos antiguos que no coincide, añade los nuevos datos, y luego envía un correo electrónico a cada persona afectada por estos cambios (un correo electrónico por persona con todos los cambios pertinentes en dicho correo electrónico, que es un otro paso entero). Las direcciones de correo electrónico son tirados por medio de una búsqueda LDAP como nuestra base de datos tiene su correo electrónico del trabajo pero el LDAP tiene su correo electrónico personal que asegura que reciben el correo electrónico antes de que entren en el día siguiente y quedar atrapados por sorpresa. Por último, el-Registro de datos se le dice "Se han realizado cambios, los mensajes se han enviado." que en realidad es lo único que importa.

Ahora podría estar añadiendo un calendario API de Google que publica los datos (cuando es la programación de datos) para el usuario de Google Calendar. Lo haría a través de su calendario de trabajo, pero pensé que me gustaría conseguir mis pies mojados con la API de Google antes de tratar con la creación de un sistema de WebDav para Exchange.

</backstory>

Ahora!

La cuestión práctica

En este punto, la integración pre-Google, el guión toma como máximo un segundo y medio para funcionar. Es bastante impresionante, al menos creo que sí (el servidor, no es mi codificación). Pero el bit de Google, en las pruebas, es muy lenta. Probablemente podemos arreglar eso, pero plantea la cuestión más grande ...

¿Cuál es la mejor manera de sacar datos algo del trabajo después de que el usuario ha recibido la confirmación de que el PP se ha actualizado? Esta es la parte que está más preocupado y la parte más crítica. notificaciones por correo electrónico y actualizaciones de Google Calendar sólo están ahí para el beneficio de los afectados por la carga, y si hay un problema con estas notificaciones, se escuchará al respecto (y luego voy a escuchar de él) sin tener en cuenta la secuencia de comandos diciendo él primero.

Entonces, ¿hay una forma, por ejemplo, para ejecutar una tarea programada que se desencadena por última ejecución de un script? PHP puede crear cronjobs con capacidad exec()? ¿Hay alguna manera normalizada de manejar el trabajo posterior a la ejecución que hay que conseguir que se hagan?

Cualquier consejo sobre esto es muy apreciado. Siento que los scripts hinchada-dad refleja mi estado de desarrollo y la necesidad de mí para saber finalmente cómo hacer de división del trabajo en las aplicaciones web.

Pero también me preocupo de que esto no se hace, como la necesidad del usuario para saber cuando se han completado todas las tareas, etc. Así que esto nos lleva a:

Las mejores prácticas / pregunta más subjetivo

Básicamente, hay una idea de que el progreso bares, la descarga en tiempo real, y otras formas de mantener al usuario atado a la secuencia de comandos se combinan --cuando con la optimización del código, de supuesto-- el mejor, más preferido, método entonces simplemente diciendo "hemos terminado con su parte, si nos necesita, estaremos notificando a los usuarios", etc, etc.

¿Hay cosas grandes para evitar (que no sea evidente que no da al usuario cualquier información en absoluto)?

Gracias por leer. La parte de codificación es crucial, por lo que no se sienten obligados a cubrir la segunda parte o se olvide de cubrir la parte de codificación!

¿Fue útil?

Solución

Hay varias maneras de hacer esto. Se podría exec (), como el de arriba dice, pero usted podría ejecutar en una situación de DoS si hay demasiados someten clics. la extensión PCNTL es sin duda mejor en los procesos de gestión de este tipo. Salida este post para ver una discusión (hay 3 partes).

Se puede usar Javascript para enviar un segundo puesto, ajax que ejecuta el script apropiado para los trabajadores después. Mediante el uso de ignore_user_abort () y el envío de un Content-Length, el navegador puede desconectar temprano, pero su proceso de Apache continuará funcionando y procesar sus datos. Al revés hay potencial forkbomb, Lo malo es que se abrirá procesos más Apache.

Sin embargo, otra opción es usar un cron en el fondo que mira a una tabla de procesos-cola sobre qué hacer 'más tarde' - que se adhieren elementos en esta tabla en la parte delantera, eliminarlos en el backend durante el procesamiento (ver Zend_Queue ).

Sin embargo, otra es utilizar un marco de trabajo más distribuido como gearmand -. Que puede procesar artículos en otras máquinas

Todo depende de sus capacidades y requisitos generales.

Otros consejos

Una tarea cron es bueno para esto. Si todo lo que quiere hacer cuando una carga datos de usuario es decir "Hey usuario, gracias por los datos!" entonces esto va a estar bien.

Si usted prefiere un enfoque más inmediata, a continuación, puede utilizar exec() para iniciar un proceso de fondo. En un entorno Linux se vería algo como esto:

exec("php /path/to/your/worker/script.php >/dev/null &");

La parte & dice "me corre en el fondo." La parte >/dev/null redirige la salida a un agujero negro. Por lo que el manejo de todos los errores y notificar a las partes apropiadas. - esto es todo hasta el diseño de su script trabajador

Para un enfoque de plataforma cruzada más flexible, consulta este Manual de post

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top