我正在尝试通过exec();
从命令行读取信息function ex($cmd){
@exec($cmd,$exec,$status);
if($status == 0){
return $exec;
}
return "";
}
我正在尝试逐行解析输出,但问题是输出行被分割(就像终端窗口“太小”一样)。对于解析,如果输出没有“行长度限制”并且一行保留一行,无论它的大小是多少,都会非常有用。
我如何存档?
答案 0 :(得分:1)
proc_open()的解决方法。这很昂贵,但这应该可以为您提供命令的确切输出:
<?php
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w")
);
$shell = '/bin/bash';
$command = 'apt-get --just-print upgrade';
$process = proc_open($shell, $descriptorspec, $pipes);
if (is_resource($process)) {
fwrite($pipes[0], $command);
fclose($pipes[0]);
$output = stream_get_contents($pipes[1]);
fclose($pipes[1]);
proc_close($process);
}
//$output holds the output in a single string
$lines = explode("\n", $output); // the full lines as array
答案 1 :(得分:0)
为什么你不直接使用exec并获得其输出。例如
$output=exec("ls -la");
然后你可以按照你想要的方式研究输出:
$lines = explode("\n",$output);
foreach($lines as $line)
echo $line."<br>";
另一方面,您可以使用passtrhu函数http://php.net/manual/en/function.passthru.php
答案 2 :(得分:0)
您可以使用shell_exec运行它,将所有输出流作为字符串返回。另一方面,exec只返回输出的最后一行。
<?php
function ex($cmd) {
return explode("\n", shell_exec($cmd));
}
$output = ex('apt-get --just-print upgrade');
var_dump($output);
答案 3 :(得分:0)
由于其他解决方案无法解决问题或成本较高,因此我使用了以下代码,这些代码不是很通用但解决了问题:
$str = ""; $versions['upgrades'] = array(); $addLines = 0;
for($i = 0; $i < count($v); $i++){
if(preg_match("~[0-9]+ upgraded~",$v[$i])){
$str = $v[$i];
break;
}
if($addLines == 1){
$versions['upgrades'] = array_merge($versions['upgrades'],array_values(explode(' ',trim($v[$i]))));
}
if(preg_match("~will be upgraded~",$v[$i])){
$addLines = 1;
}
}