PHP su una macchina Windows; Avvia il process in background

Sto cercando il meglio, o in qualsiasi modo davvero per avviare un process da php in background, così posso ucciderlo più tardi nella sceneggiatura.

In questo momento sto usando: shell_exec ($ Command); Il problema con questo è che il programma si chiude.

Voglio qualcosa che abbia lo stesso effetto di nohup quando eseguo il command shell. Questo mi consentirà di eseguire il process in background, in modo che più avanti nello script possa essere chiuso. Ho bisogno di chiuderlo perché questo script verrà eseguito regolarmente e il programma non può essere aperto quando viene eseguito.

Ho pensato di generare un file .bat per eseguire il command in background, ma anche allora, come posso uccidere il process in un secondo momento?

Il codice che ho visto per Linux è:

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

EDIT : Risulta che non ho bisogno di uccidere il process

Questa function del manuale PHP sarà di aiuto?

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

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

Il parametro /B è la chiave qui.

Non riesco a trovare where ho trovato questo. Ma questo funziona per me.

Ho cercato di get lo stesso su un server Windows 2000 con PHP 5.2.8.

Nessuna delle soluzioni ha funzionato per me. PHP ha continuato ad aspettare la risposta.

Trovato la soluzione per essere:

 $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 

Dal manuale php per exec :

Se un programma viene avviato con questa function, affinché possa continuare a essere eseguito in background, l'output del programma deve essere reindirizzato a un file oa un altro stream di output. Non riuscendo a farlo causerà il block di PHP fino al termine dell'esecuzione del programma.

per esempio pipe l'output in un file e php non lo aspetterà:

 exec('myprog > output.txt'); 

Dalla memory, credo che ci sia un personaggio di controllo che puoi anteporre (come fai con @) alla famiglia di comandi exec che impedisce anche l'esecuzione dalla pausa – non riesco a ricordare cosa sia.

Modifica Trovato! Su Unix, i programmi eseguiti con & prepended verranno eseguiti in background. Spiacente, non ti aiuta molto.

Sulle mie macchine Windows 10 e Windows Server 2012, l'unica soluzione che funzionava in modo affidabile in pclose / popen era quella di ricall il command Start-Process di PowerShell, come in:

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

O più verbalmente se vuoi fornire argomenti e output di reindirizzamento:

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