在使用浏览器和使用命令行时,在PHP中执行系统命令会有所不同

时间:2010-06-05 13:08:45

标签: php linux

我必须从特定偏移量在PHP中执行Linux more命令,格式化结果并在浏览器中显示结果。

我的上述代码是:

<html>
<head>
    <META HTTP-EQUIV=REFRESH CONTENT=10>
    <META HTTP-EQUIV=PRAGMA CONTENT=NO-CACHE>
    <title>Runtime Access log</title>
</head>
<body>
    <?php
    $moreCommand = "more +3693 /var/log/apache2/access_log | grep -v -e '.jpg' -e '.jpeg' -e '.css' -e '.js' -e '.bmp' -e '.ico'| wc -l";
     exec($moreCommand, $accessDisplay);
     echo "<br/>No of lines are : $accessDisplay[0] <br/>";
    ?>
</body>
</html>

浏览器的输出为:行数为:3428(这是错误的)

使用命令行执行相同的命令时会产生不同的输出。我的代码片段是:

<?php
    $moreCommand = "more +3693 /var/log/apache2/access_log | grep -v -e '.jpg' -e '.jpeg' -e '.css' -e '.js' -e '.bmp' -e '.ico'| wc -l";

    exec($moreCommand, $accessDisplay);
    echo "No of lines are : $accessDisplay[0] \n";
?>

命令行的输出为:行数为:279(这是正确的)

在命令行中直接执行相同的命令时,输出为279。

我无法理解为什么浏览器中同一命令的输出错误。它实际上给出了行的字数,忽略了偏移参数。

2 个答案:

答案 0 :(得分:1)

我建议您删除shell管道并直接在PHP中解析日志文件。更多的控制。麻烦少得多,而且更加强大。

答案 1 :(得分:0)

有什么区别:

$moreCommand = "more -f -99999 +3693 /var/log/apache2/access_log | grep -v -e '.jpg' -e '.jpeg' -e '.css' -e '.js' -e '.bmp' -e '.ico' -c"

( - f&amp; -num to more,-c to grep而不是| wc -l)

在调试中,检查确切的输出而不计算2(可能使用头部或尾部)也是有用的,因为cli和amp;之间可能存在shell差异。网络服务器用户。


好的,这是错误的,可以重现更多而不是'+',替代方案:

$moreCommand = "tail --lines=`wc -l /var/log/apache2/access_log  | awk '{print $1 - 3693}'  | grep -v -e '.jpg' -e '.jpeg' -e '.css' -e '.js' -e '.bmp' -e '.ico' `