Tengo una tarea de proceso intensivo que me gustaría ejecutar en segundo plano.
El usuario hace clic en una página, se ejecuta el script PHP y, finalmente, según algunas condiciones, si es necesario, debe ejecutar un script de shell, por ejemplo:
shell_exec('php measurePerformance.php 47 844 [email protected]');
Actualmente uso shell_exec , pero esto requiere que el script espere una salida. ¿Hay alguna forma de ejecutar el comando que quiero sin esperar a que se complete?
Respuestas:
¿Qué tal agregar?
Tenga en cuenta que esto también elimina stdio y stderr.
fuente
> /dev/null 2>&1 &
como se ve en otras respuestas, es una forma concisa de> /dev/null 2>/dev/null &
dada aquí. Esto básicamente dice "redirigir STDERR (2) al mismo lugar que STDOUT (& 1)".Esto ejecutará un comando y se desconectará del proceso en ejecución. Por supuesto, puede ser cualquier comando que desee. Pero para una prueba, puede crear un archivo php con un comando sleep (20).
fuente
nohup
y el&
?También puede devolver su salida al cliente instantáneamente y continuar procesando su código PHP después.
Este es el método que estoy usando para llamadas Ajax de larga espera que no tendrían ningún efecto en el lado del cliente:
Puede encontrar la explicación detallada aquí: http://oytun.co/response-now-process-later
fuente
En Windows 2003, para llamar a otro script sin esperar, utilicé esto:
Esto solo funciona DESPUÉS de otorgar permisos de cambio en
cmd.exe
: agregue Leer y Ejecutar paraIUSR_YOURMACHINE
(también configuré la escritura en Denegar).fuente
Seguro, porque
windows
puedes usar:Nota:
Si recibe un
COM
error, agregue la extensión a suphp.ini
y reinicieapache
:fuente
Utilice el
popen
comando de PHP , por ejemplo:Esto creará un proceso hijo y el script se ejecutará en segundo plano sin esperar la salida.
fuente
Si está fuera de una página web, recomiendo generar una señal de algún tipo (colocar un archivo en un directorio, tal vez) y hacer que un trabajo cron recoja el trabajo que debe hacerse. De lo contrario, es probable que entremos en el territorio del uso
pcntl_fork()
yexec()
desde el interior de un proceso de Apache, y eso es simplemente un mal mojo.fuente
Eso funcionará, pero tendrá que tener cuidado de no sobrecargar su servidor porque creará un nuevo proceso cada vez que llame a esta función que se ejecutará en segundo plano. Si solo hay una llamada simultánea al mismo tiempo, esta solución hará el trabajo.
Si no es así, aconsejaría ejecutar una cola de mensajes como, por ejemplo, beanstalkd / gearman / amazon sqs.
fuente