Xavier, miembro de nuestro equipo de trabajo, nos ha hecho el favor de escribir este artículo ya que conoce muy bien el tema.
Solución:
Haciendo un poco de experimentación con exec
y shell_exec
¡He descubierto una solución que funcionó perfectamente! elijo usar shell_exec
para que pueda registrar todos los procesos de notificación que suceden (o no). (shell_exec
regresa como un string y esto fue más fácil que usar exec
asignando la salida a una variable y luego abriendo un archivo para escribir).
Estoy usando la siguiente línea para invocar el script de correo electrónico:
shell_exec("/path/to/php /path/to/send_notifications.php '".$post_id."' 'alert' >> /path/to/alert_log/paging.log &");
Es importante notar la &
al final del comando (como lo señaló @netcoder). Este comando de UNIX ejecuta un proceso en segundo plano.
Las variables adicionales entre comillas simples después de la ruta al script se establecen como $_SERVER['argv']
variables que puedo llamar dentro de mi script.
El script de correo electrónico luego se envía a mi archivo de registro usando el >>
y generará algo como esto:
[2011-01-07 11:01:26] Alert Notifications Sent for http://alerts.illinoisstate.edu/2049 (SCRIPT: 38.71 seconds)
[2011-01-07 11:01:34] CRITICAL ERROR: Alert Notifications NOT sent for http://alerts.illinoisstate.edu/2049 (SCRIPT: 23.12 seconds)
En servidores Linux/Unix, puede ejecutar un trabajo en segundo plano utilizando proc_open:
$descriptorspec = array(
array('pipe', 'r'), // stdin
array('file', 'myfile.txt', 'a'), // stdout
array('pipe', 'w'), // stderr
);
$proc = proc_open('php email_script.php &', $descriptorspec, $pipes);
los &
siendo lo importante aquí. La secuencia de comandos continuará incluso si la secuencia de comandos original ha finalizado.
De todas las respuestas, ninguna consideró la ridículamente fácil función fastcgi_finish_request, que cuando se llama, descarga todos los resultados restantes en el navegador y cierra la sesión de Fastcgi y la conexión HTTP, mientras deja que el script se ejecute en segundo plano.
Un ejemplo:
true]);
fastcgi_finish_request(); // The user is now disconnected from the script
// do stuff with received data,
Te mostramos comentarios y valoraciones
Al final de la página puedes encontrar las explicaciones de otros gestores de proyectos, tú de igual forma eres capaz dejar el tuyo si lo crees conveniente.