PHP exec()行长度(每行字符数)

时间:2014-07-08 16:01:22

标签: php shell exec

我正在尝试通过exec();

从命令行读取信息
function ex($cmd){

    @exec($cmd,$exec,$status);

    if($status == 0){
        return $exec;   
    }
    return "";

}

我正在尝试逐行解析输出,但问题是输出行被分割(就像终端窗口“太小”一样)。对于解析,如果输出没有“行长度限制”并且一行保留一行,无论它的大小是多少,都会非常有用。

我如何存档?

4 个答案:

答案 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;
    }
}