2010-01-14 33 views
6

Estoy buscando lo mejor, o cualquier forma de comenzar un proceso desde php en segundo plano para poder matarlo más adelante en el script.PHP en una máquina de Windows; Proceso de inicio en segundo plano

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

Quiero algo que tendrá 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 para matar el proceso

+0

Entonces, ¿cuál fue la solución? – Aramil

Respuesta

4

¿Esto function from the PHP Manual ayuda?

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"); 
} 
+0

Terminé usando (casi) esto para iniciar un archivo por lotes y funciona perfectamente ahora. –

+0

Perdón por excavar esta antigua tumba. Estoy usando el mismo código para ejecutar el programa externo que hice en C#. El script browser/php o apache simplemente se cuelga, si esta aplicación C# arroja una excepción. ¿Hay alguna solución para esto? – WatsMyName

+0

@LoVeSmItH: No hay idea hombre. = \ –

1

Desde el manual de 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 otra salida corriente Si no lo hace, PHP se bloqueará hasta que finalice 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 de comandos exec que también evita que la ejecución se detenga, pero no recuerdo qué es.

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

+0

Terminé usando el archivo por lotes y haciendo: sistema ("cmd/c C: [ruta al archivo]"); Eso mantiene la secuencia de comandos en funcionamiento. ¿Alguna idea sobre cómo matar el proceso? Esto realmente abre Adobe Reader, y todavía necesito una forma de cerrarlo antes de que el script se ejecute nuevamente. –

+0

No importa, resulta que no necesito matar el proceso. Puedo dejarlo funcionando. –

+1

Actualmente estoy probando esto en un sistema de Windows y todavía está esperando que el script termine en la ventana del navegador sin importar el hecho de que está saliendo a un archivo. Tiene alguna idea sobre esto? –

8

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

El parámetro /B es clave aquí.

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

+0

No sabía sobre/B. Muy útil, gracias. –

+0

Para completar, dejo el enlace a los documentos sobre el comando de inicio aquí: https://technet.microsoft.com/en-us/library/cc770297(v=ws.11).aspx – zinky

2

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

Ninguna de las soluciones funcionó para mí. PHP siguió esperando 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 
1

en mi Windows 10 y Server 2012 máquinas Windows, 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')); 
Cuestiones relacionadas