PHP`exec`在后台但得到STDOUT

时间:2013-01-23 08:02:31

标签: php background exec fork

我正在尝试通过PHP执行命令(在Windows和Linux中)。我的目标是让命令的多个实例同时运行(因此背景),但我还需要获取每个实例的输出。

这不起作用,因为无法获取输出。

function execInBackground($cmd) { 
    if (substr(php_uname(), 0, 7) == "Windows"){ 
        pclose(popen("start /B ". $cmd, "r"));  
    } 
    else { 
        exec($cmd . " > /dev/null &");   
    } 
}
分享会帮助我吗?我也看到了PHP exec in background using & is not working但又在哪里得到了输出?

任何想法都会很棒!

编辑:我们使用的是PHP v5.2,其他PHP版本无法使用!

3 个答案:

答案 0 :(得分:2)

兼容Linux&在Windows环境中,您可以使用Symfony2 Process component。它允许您在轻松获取输出的同时运行代码背景:

use Symfony\Component\Process\Process;

$process = new Process($cmd);
$process->start(function ($type, $buffer) {
    if ('err' === $type) {
        // Do something with error $buffer
    } else {
        // Do something with normal $input
    }
});

// Do something else

// Wait until the process completes
$process->wait();

请注意,您应使用$process->start()代替$process->run()来允许后台执行。

更多链接:

答案 1 :(得分:1)

用&执行命令并输出到文件:

exec($cmd . " > output".$NumberOfInstance.".txt &"); 

之后,您可以在完成后阅读内容。

exec($cmd . " > output".$NumberOfInstance.".txt ; php phpscriptwhereyouchecktheoutputfilewithaverylongname.php&"); 

尝试使用此脚本在第一个命令结束后执行PHP脚本,在指令之间使用;

答案 2 :(得分:1)

如果使用“Windows PowerShell”或运行> cmd来执行命令,您将很容易获得输出。这将立即返回结果,如果您想要输出处理它不是好解决方案,它只是用于测试结果

在window和linux中执行命令的另一种情况:

if (getenv('OS')=='Windows_NT'){
        exec($pathToFileExecute.$command);
    }
    else {
        exec($command);
    }
Linux上没有需要$ pathToFileExcute 例如:$ pathToFileExecute ='E:^ \ Setup ^ \ wamp ^ \ bin ^ \ mysql ^ \ mysql5.5.20 ^ \ bin ^ \';