Pregunta

Estoy buscando la mejor, o de cualquier manera realmente para iniciar un proceso de php en el fondo para que pueda acabar con él más tarde en el guión.

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

Quiero algo que va a tener el mismo efecto que nohup cuando ejecuto el comando shell. Esto permitirá que funcione el proceso en segundo plano, de manera que más adelante en la secuencia de comandos que se puede cerrar. Necesito para cerrarla porque este script se ejecutará sobre una base regular y el programa no se puede abrir cuando este se ejecuta.

He pensado en generar un archivo .bat para ejecutar el comando en el fondo, pero aún así, ¿cómo lo mato el proceso más adelante?

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 para matar el proceso

Otros consejos

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

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

Parece que no puedo encontrar donde me encontré con esto. Pero esto funciona para mí.

tratado de lograr el mismo en un servidor Windows 2000 con PHP 5.2.8.

Ninguna de las soluciones que funcionó para mí. PHP mantiene a la espera de la respuesta.

encontrado la solución a 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

Desde el manual de PHP para exec:

  

Si un programa se inicia con esta función, con el fin de que continúe funcionando en segundo plano, la salida del programa debe ser redirigido a un archivo u otro flujo de salida. De no hacerlo, causará que PHP colgar hasta que termine la ejecución del programa.

es decir canalizar la salida en un archivo php y no esperará a que:

exec('myprog > output.txt');

De memoria, creo que hay un carácter de control que se puede anteponer (como se hace con @) a la familia exec de comandos que también impide la ejecución de una pausa -. No puedo recordar lo que es, sin embargo

Editar ha encontrado! En UNIX, los programas ejecutados con precedidas y se ejecutará en segundo plano. Lo sentimos, no le ayuda mucho.

en mi Windows 10 y Windows Server 2012 máquinas, la única solución que funcionó con seguridad dentro de pclose / popen era para invocar el comando de arranque-Proceso de PowerShell, como en:

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

O más informa extensamente si desea suministrar argumentos y redirigir salidas:

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