我正在尝试通过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版本无法使用!答案 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 ^ \';