【问题标题】:PHP execute process in background and get resultsPHP在后台执行进程并获取结果
【发布时间】:2016-10-31 09:25:15
【问题描述】:

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

到目前为止,我管理人员以类似

的方式开始该过程
pclose ( popen ( "\"start /B " . $commands . " > log.txt\"", "r" ) );

但我不确定如何确定进程是否终止(也许早上太早了,但我无法使用 popen 和 start /B 找到更多相关信息)

我正在使用“启动”方式,因为理想情况下该解决方案应该在 windows 和 linux 上运行。

任何意见将不胜感激。 感谢您的帮助!

【问题讨论】:

  • 我不确定你到底想做什么,异步?我认为您应该看看线程以并行执行任务。

标签: php process background popen


【解决方案1】:

我必须执行类似的任务,尽管我的方法略有不同,但与您尝试做的非常相似,并且我通过了套接字:

第一步:获取进程PID并调用socket文件

            //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 的进程是否仍在运行,如果没有,则发送消息并退出进程。我没有发布套接字的东西,因为我认为有很好的库可以解决这个问题,而且我的方法是手工制作的,可能会让人难以理解。

第三个:在需要的地方处理套接字消息

可能你想在 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>

【讨论】:

  • 不错的解决方案,感谢您的宝贵时间!我想我会使用 Laravel 队列系统,它可以让我轻松地管理我的工作,并为我处理好守护进程和所有事情。无论如何,我不需要在前端立即获得结果,这样就可以了。但再次感谢您分享您的方法
猜你喜欢
  • 2017-04-04
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多