PHP su una macchina Windows; Avvia il processo in background




kill nohup (4)

Sto cercando il meglio, o in qualsiasi modo davvero per avviare un processo 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 comando shell. Questo mi consentirà di eseguire il processo 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 comando in background, ma anche allora, come posso uccidere il processo 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 processo


Questa funzione 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 dove ho trovato questo. Ma questo funziona per me.


Ho cercato di ottenere 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

Sui miei computer Windows 10 e Windows Server 2012, l'unica soluzione che funzionava in modo affidabile in pclose / popen era quella di richiamare il comando 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'));




nohup