2016-10-31 39 views
0

我正在尋找一種簡單的方式在後臺啓動進程(通過php)(我不希望我的php腳本等待結束)。儘管我也需要在其他方面處理流程,以便在執行結束後執行一些事後工作。PHP在後臺執行進程並獲得結果

到目前爲止,我經理的東西開始的過程是怎樣的

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

但我不知道如何找到進程是否結束(也許這是早上太早,但我可以」 t找到很多關於它使用popen和開始/ B)

我使用「開始」的方式,因爲理想的解決方案應該在Windows和Linux上運行。

任何輸入,將不勝感激。 感謝您的幫助!

+0

我不知道你想做的事完全是,異步是什麼? 我想你應該看看線程並行執行任務。 – Fky

回答

1

我不得不執行類似的任務,但我有一個稍微不同的方法,非常類似於你正在嘗試做的,我通過socket去:

第一步:獲取進程PID並調用套接字文件

  //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步:守護程序文件

的daemon.php應該打開,在如果PR間隔檢查一個Socket給定的PID仍然在運行,如果沒有,發送消息並退出過程。我沒有發佈套接字的東西,因爲我認爲有很好的庫,而我的方法是手工製作的,所以很難理解。

3:在需要的地方

過程套接字消息也許你想這樣做,在javascript

<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

很好的解決方案,謝謝你的時間!我想我會使用Laravel隊列系統,這將讓我輕鬆管理自己的工作,並關心deamon和我的一切。無論如何,我不需要立即在前端得到結果,這樣就可以做到。但再次感謝分享您的方法 – Ours