¿Hay alguna manera de usar shell_exec sin esperar a que se complete el comando?

5 minutos de lectura

¿Hay alguna manera de usar shell exec sin esperar a que
amigo duro

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@yahoo.com');

Actualmente uso shell_exec, pero esto requiere que el script espere una salida. ¿Hay alguna forma de ejecutar el comando que quiero? sin esperando a que termine?

  • NOTA: El proceso debe comenzar de inmediato, por lo que un cron no es una opción.

    – amigo duro

    19 de junio de 2009 a las 20:27

  • Solo una nota rápida: asegúrese de que la página no sea accesible para todos (motores de búsqueda/usuarios fraudulentos) y si se encuentra en un entorno compartido, el tiempo de ejecución de todos sus scripts (¡en particular php!) probablemente sea limitado. En cualquier caso, es posible que desee echar un vistazo a set_time_limit/php.ini.

    – merkuro

    19 de junio de 2009 a las 20:35

  • Posible duplicado de php ejecuta un proceso en segundo plano

    – Sean el Frijol

    31 de enero de 2018 a las 21:33

¿Qué hay de agregar.

"> /dev/null 2>/dev/null &"

shell_exec('php measurePerformance.php 47 844 email@yahoo.com > /dev/null 2>/dev/null &');

Tenga en cuenta que esto también elimina stdio y stderr.

  • No. Sin efectos secundarios. Si en algún momento decide que desea la salida stdio o stderr de su proceso, considere stackoverflow.com/questions/45953/…

    – nerviosismo

    19 de junio de 2009 a las 21:00

  • Pregunta: Eso es simplemente descartar la salida, ¿verdad? ¿PHP todavía espera a que termine el proceso antes de continuar con la ejecución, o se dispara y se olvida?

    – Alan Tormenta

    19 de junio de 2009 a las 21:06

  • Sí se descarta. Sí dispara y olvida

    – nerviosismo

    19 de junio de 2009 a las 21:17

  • Nota: > /dev/null 2>&1 & como se ve en otras respuestas es una forma concisa de > /dev/null 2>/dev/null & dado aquí. Esto básicamente dice “redirigir STDERR (2) al mismo lugar que STDOUT (&1)”.

    – rymo

    10 de julio de 2015 a las 21:26

  • ¡Generalmente obtengo el PID del script en ejecución agregando echo $! >> /tmp/pid.txt al final del comando exec pero al redirigir la salida y el error a /dev/null, no más archivos pid: ¿alguno de ustedes puede obtener el PID del script iniciado por exec sin esperar la salida?

    – hugsbrugs

    22 de febrero de 2016 a las 10:21

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

exec("nohup /usr/bin/php -f sleep.php > /dev/null 2>&1 &");

  • ¿Es mejor esto o shell_exec?

    – realtebo

    27 de noviembre de 2015 a las 10:38

  • hola, ¿puedo ejecutar la función usando este shell_exec(“nohup /usr/bin/php -f ejemplo.com/notificaciones/sendnotifications_async > /dev/null 2>&1 &”);

    – Wasim Bashir

    1 de febrero de 2017 a las 12:53


  • Por qué ambas cosas nohup y el &?

    – bugmenot123

    28 de febrero de 2019 a las 10:28

También puede devolver su salida al cliente al instante 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:

ob_end_clean();
ignore_user_abort();
ob_start();
header("Connection: close");
echo json_encode($out);
header("Content-Length: " . ob_get_length());
ob_end_flush();
flush();
// execute your command here. client will not wait for response, it already has one above.

Puedes encontrar la explicación detallada aquí: http://oytun.co/response-now-process-later

  • Ops… Estaba despertando una pregunta zombie aquí, no me he dado cuenta. Pero esta información podría ser beneficiosa para otros.

    – Oytún

    14 mayo 2013 a las 15:04

  • Esto tiene nada que ver con shell_exec

    – bugmenot123

    28 de febrero de 2019 a las 10:28

  • Estoy usando esto para pruebas locales a remotas. En el control remoto, uso shell_exec. Gracias 🙂

    – burbuja de burbujas

    10 de julio de 2021 a las 22:51

En Windows 2003, para llamar a otro script sin esperar, usé esto:

$commandString = "start /b c:\\php\\php.EXE C:\\Inetpub\\wwwroot\\mysite.com\\phpforktest.php --passmsg=$testmsg"; 
pclose(popen($commandString, 'r'));

Esto solo funciona DESPUÉS de otorgar permisos de cambio en cmd.exe – añadir Leer y Ejecutar para IUSR_YOURMACHINE (También configuré escribir en Denegar).

Usa PHP popen comando, por ejemplo:

pclose(popen("start c:\wamp\bin\php.exe c:\wamp\www\script.php","r"));

Esto creará un proceso secundario y el script se ejecutará en segundo plano sin esperar la salida.

  • Espera a que finalice el proceso hijo. Al menos en Win

    – Max Chernopolski

    15 de febrero de 2016 a las 5:17

  • El segundo plano aquí se logra con la ayuda del comando de “inicio” de Windows que precede al exe que desea ejecutar, no funcionará si lo omite, y no esperaría que funcione en otro sistema operativo … pero SÍ LO HACE funciona para mí, gracias! 🙂

    – Antonio

    2 de diciembre de 2016 a las 15:42


  • esto funcionó para mí en win 10 sin abrir la ventana cli: start /B php wait.php args

    – burbuja de burbujas

    11 de julio de 2021 a las 18:51

claro, por windows puedes usar:

$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("C:/path/to/php-win.exe -f C:/path/to/script.php", 0, false);

Nota:

si obtienes un COM error, agregue la extensión a su php.ini y reiniciar apache:

[COM_DOT_NET]
extension=php_com_dotnet.dll

  • Espera a que finalice el proceso hijo. Al menos en Win

    – Max Chernopolski

    15 de febrero de 2016 a las 5:17

  • El segundo plano aquí se logra con la ayuda del comando de “inicio” de Windows que precede al exe que desea ejecutar, no funcionará si lo omite, y no esperaría que funcione en otro sistema operativo … pero SÍ LO HACE funciona para mí, gracias! 🙂

    – Antonio

    2 de diciembre de 2016 a las 15:42


  • esto funcionó para mí en win 10 sin abrir la ventana cli: start /B php wait.php args

    – burbuja de burbujas

    11 de julio de 2021 a las 18:51

¿Hay alguna manera de usar shell exec sin esperar a que
caos

Si está fuera de una página web, recomiendo generar una señal de algún tipo (tal vez colocar un archivo en un directorio) y hacer que un trabajo cron recoja el trabajo que debe realizarse. De lo contrario, es probable que entremos en el territorio de usar pcntl_fork() y exec() desde dentro de un proceso de Apache, y eso es simplemente mal mojo.

  • dijiste que es un mojo malo. ¿Puedes por favor elaborar?

    – Mayak

    7 febrero 2017 a las 16:21


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad