PHP在后台执行进程并获得结果

时间:2016-10-31 09:25:15

标签: php process background popen

我正在寻找一种在后台启动进程(通过php)的简单方法(我不希望我的php脚本等待结束)。虽然我还需要在其他过程中处理该过程以处理其执行结束以进行一些后续工作。

到目前为止,我经理用

之类的东西开始这个过程
pclose ( popen ( "\"start /B " . $commands . " > log.txt\"", "r" ) );

但是我不确定如何找到这个过程是否已经终止(可能是早上太早了但是我用popen和start / B找不到它)

我正在使用“开始”方式,因为理想情况下,解决方案应该在Windows和Linux上运行。

任何输入都将不胜感激。 谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

我必须执行类似的任务,虽然我的方法略有不同,但与你想要做的非常相似,我经历了插座:

第一步:获取进程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");

第二步:守护程序文件

daemon.php应该打开一个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>