2016-10-31 3 views
0

Ich suche nach einer einfachen Möglichkeit, einen Prozess (über PHP) im Hintergrund zu starten (Ich möchte nicht, dass mein PHP-Skript auf das Ende warten). Obwohl ich auch den Prozess in einem anderen Griff haben müsste, um das Ende seiner Ausführung aufzufangen, um etwas Nacharbeit zu leisten.PHP-Prozess im Hintergrund ausführen und Ergebnisse

Bisher habe ich Manager den Prozess mit so etwas wie

pclose (popen ("\"start /B " . $commands . " > log.txt\"", "r")); 

zu starten, aber ich bin nicht sicher, wie man finden, wenn der Prozess beendet ist (und es ist vielleicht zu früh am Morgen, aber ich kann‘ t finden Sie viel darüber mit popen und starten/B)

Ich benutze den "Start" Weg, weil die Lösung sollte idealerweise auf Windows und Linux laufen.

Jede Eingabe wäre willkommen. Danke für die Hilfe!

+0

Ich bin nicht sicher, in Javascript zu tun, was Sie genau tun wollen, asynchron? Ich denke, Sie sollten sich Threads ansehen, um Aufgaben parallel auszuführen. – Fky

Antwort

1

Ich hatte eine ähnliche Aufgabe zu erfüllen, und obwohl ich einen etwas anderen Ansatz hatte, ist ganz ähnlich zu dem, was Sie zu tun versuchen, und ich ging durch Buchsen:

1. Schritt: die Prozess-PID und rufen Socket-Datei

  //windows 
      $desc = array(
       0 => array("pipe", "r"), 
       1 => array("pipe", "w"), 
      ); 
      $p = proc_open($command, $desc, $pipes); 
      $status = proc_get_status($p); 
      $ppid = $status["pid"]; 
      $output = array_filter(explode(" ", shell_exec("wmic process get parentprocessid,processid | find \"$ppid\""))); 
      array_pop($output); 
      $pid = end($output); 

      //unix 
      $pid = trim(shell_exec(sprintf('%s > %s 2>&1 & echo $!', $command, $outputFile))) 

      //Call the daemon with the socket stuff and pass the pid 
      shell_exec("path/to/daemon.php $pid"); 

2. Schritt: der Dämon Datei

die daemon.php sollte einen Sockel öffnen, wenn die pr in Intervallen überprüft Der Prozess mit der angegebenen PID läuft noch und wenn nicht, senden Sie eine Nachricht und beenden Sie den Prozess. Ich habe die Socket-Sachen nicht geposted, weil ich denke, dass es dafür gute Bibliotheken gibt, und meine Herangehensweise war von Hand gemacht, was es schwierig machen kann, sie zu verstehen.

3.: Prozess Socket-Nachrichten benötigt, wo

Wahrscheinlich wollen Sie, dass

<script language="javascript" type="text/javascript"> 
$(document).ready(function(){ 
    var wsUri = "ws://host:port/daemon.php";  
    websocket = new WebSocket(wsUri); 

    websocket.onopen = function(ev) { 
    } 
    websocket.onmessage = function(ev) { 
     var msg = JSON.parse(ev.data); 
     switch(msg.action){ 
      case "process_finisihed":{ 
       //doThingsHere 
      } 
      break; 

     } 
    }; 

    websocket.onerror = function(ev){ console.debug(ev); }; 
    websocket.onclose = function(ev){}; 
}); 
</script> 
+0

Schöne Lösung, danke für Ihre Zeit! Ich denke, ich werde das Laravel-Queue-System benutzen, das mir erlauben wird, meine Jobs leicht zu verwalten und mich um Deamons und alles für mich zu kümmern. Ich brauche sowieso kein sofortiges Ergebnis im Frontend, also wird es reichen. Aber nochmals vielen Dank, dass Sie Ihren Ansatz geteilt haben – Ours

Verwandte Themen