simple shell_exec example ejecutar desde php shell

php - example - ¿Hay alguna forma de usar shell_exec sin esperar a que se complete el comando?



shell.php wordpress (9)

¿Qué tal agregar?

"> /dev/null 2>/dev/null &" shell_exec(''php measurePerformance.php 47 844 [email protected] > /dev/null 2>/dev/null &'');

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

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 un resultado. ¿Hay alguna forma de ejecutar el comando que quiero sin esperar a que se complete?


En Windows 2003, para llamar a otra secuencia de comandos sin esperar, utilicé 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 dar permisos cambiantes en cmd.exe - agregue Leer y ejecutar para IUSR_YOURMACHINE (también configuro la escritura en Denegar).


Eso funcionará, pero deberá tener cuidado de no sobrecargar su servidor, ya que 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.

De lo contrario, aconsejaría ejecutar una cola de mensajes como, por ejemplo, beanstalkd / gearman / amazon sqs.


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 &");


Para windows puede 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 obtiene un error COM , agregue la extensión a su php.ini y reinicie apache :

[COM_DOT_NET] extension=php_com_dotnet.dll


Si está fuera de una página web, recomiendo generar una señal de algún tipo (dejando caer un archivo en un directorio, tal vez) y tener una tarea cron que recoja el trabajo que necesita hacerse. De lo contrario, es probable que lleguemos al territorio de usar pcntl_fork() y exec() desde dentro de un proceso Apache, y eso es solo un mal mojo.


Siempre puede publicar algo de AJAX en una página que llame al shell_exec ().


También puede devolver su salida al cliente de forma instantánea y continuar procesando su código PHP posteriormente.

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.

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


Use el comando popen de PHP, por ejemplo:

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

Esto creará un proceso secundario y la secuencia de comandos se ejecutará en segundo plano sin esperar la salida.