0

我正在尝试通过 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 使用 & 也不起作用,但又在哪里获得输出?

任何想法都会很棒!

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

4

3 回答 3

2

为了兼容 Linux 和 Windows 环境,您可以使用Symfony2 Process 组件。它将允许您在轻松获取输出的同时运行代码后台:

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()允许后台执行。

更多链接:

于 2013-01-23T08:16:53.927 回答
1

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

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

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

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

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

于 2013-01-23T08:04:47.950 回答
1

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

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

if (getenv('OS')=='Windows_NT'){
        exec($pathToFileExecute.$command);
    }
    else {
        exec($command);
    }

$pathToFileExcute 在 linux ex 上是不需要的
: $pathToFileExecute = 'E:^\Setup^\wamp^\bin^\mysql^\mysql5.5.20^\bin^\';

于 2013-01-23T08:19:15.430 回答