segundo programa proceso primer plano pasar ejecutar como aplicaciones php windows background kill nohup

php - programa - ejecutar en segundo plano windows



PHP en una máquina de Windows; Comience el proceso en segundo plano (5)

Estoy buscando lo mejor, o cualquier forma de comenzar un proceso desde php en segundo plano, así puedo matarlo más adelante en el script.

En este momento, estoy usando: shell_exec ($ Command); El problema con esto es que espera que el programa se cierre.

Quiero algo que tenga el mismo efecto que nohup cuando ejecuto el comando de shell. Esto me permitirá ejecutar el proceso en segundo plano, de modo que más adelante en el guión pueda cerrarse. Necesito cerrarlo porque este script se ejecutará de forma regular y el programa no se podrá abrir cuando se ejecute.

He pensado en generar un archivo .bat para ejecutar el comando en segundo plano, pero aun así, ¿cómo puedo matar el proceso más tarde?

El código que he visto para Linux es:

$PID = shell_exec("nohup $Command > /dev/null & echo $!"); // Later on to kill it exec("kill -KILL $PID");

EDITAR : Resulta que no necesito matar el proceso


Del manual php para exec :

Si se inicia un programa con esta función, para que continúe ejecutándose en segundo plano, la salida del programa debe redirigirse a un archivo u otro flujo de salida. Si no lo hace, PHP se bloqueará hasta que finalice la ejecución del programa.

es decir, canalizar la salida a un archivo y php no lo esperará:

exec(''myprog > output.txt'');

Desde la memoria, creo que hay un carácter de control que puedes anteponer (como lo haces con @) a la familia de comandos del ejecutor que también evita que la ejecución se detenga, aunque no puedo recordar qué es.

Editar encontrado! En Unix, los programas ejecutados con & prepended se ejecutarán en segundo plano. Lo siento, no te ayuda mucho.


¿Ayudará esta función del manual de PHP ?

function runAsynchronously($path,$arguments) { $WshShell = new COM("WScript.Shell"); $oShellLink = $WshShell->CreateShortcut("temp.lnk"); $oShellLink->TargetPath = $path; $oShellLink->Arguments = $arguments; $oShellLink->WorkingDirectory = dirname($path); $oShellLink->WindowStyle = 1; $oShellLink->Save(); $oExec = $WshShell->Run("temp.lnk", 7, false); unset($WshShell,$oShellLink,$oExec); unlink("temp.lnk"); }


Intenté lograr lo mismo en un servidor de Windows 2000 con PHP 5.2.8.

Ninguna de las soluciones funcionó para mí. PHP siguió esperando la respuesta.

Encontré la solución para ser:

$cmd = "E:/PHP_folder_path/php.exe E:/some_folder_path/backgroundProcess.php"; pclose(popen("start /B ". $cmd, "a")); // mode = "a" since I had some logs to edit


shell_exec(''start /B "C:/Path/to/program.exe"'');

El parámetro /B es la clave aquí.

Parece que no puedo encontrar dónde encontré esto más. Pero esto funciona para mí.


En mis máquinas con Windows 10 y Windows Server 2012, la única solución que funcionaba de manera confiable dentro de pclose / popen era invocar el comando Start-Process de powershell, como en:

pclose(popen(''powershell.exe "Start-Process foo.bat -WindowStyle Hidden"'',''r''));

O más detalladamente si desea proporcionar argumentos y redirigir los resultados:

pclose(popen(''powershell.exe "Start-Process foo.bat -ArgumentList /'bar/',/'bat/' -WindowStyle Hidden -RedirectStandardOutput /'.//console.out/' -RedirectStandardError /'.//console.err/'"'',''r''));