2016-10-31 41 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