Saltar al contenido

¿Cómo puedo ejecutar un script PHP en segundo plano después de enviar un formulario?

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 execasignando 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *