Выполнение системной команды в PHP отличается при использовании браузера и командной строки - PullRequest
0 голосов
/ 05 июня 2010

Мне нужно выполнить команду Linux more в PHP с определенного смещения, отформатировать результат и отобразить результат в браузере.

Мой код для вышеупомянутого:

<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 ]

1 голос
/ 05 июня 2010

Я бы порекомендовал вам удалить конвейер оболочки и разобрать лог-файл в PHP напрямую. Гораздо больше контроля. Гораздо меньше хлопот и определенно более надежный.

0 голосов
/ 05 июня 2010

В чем будет разница:

$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 & -num больше, -c grep вместо | wc -l)

При отладке также может быть полезно проверить точный вывод без подсчета 2 (возможно, с использованием головы или хвоста), поскольку между пользователями cli и web-сервера могут быть различия в оболочке.


ОК, это было неправильно, можно воспроизвести больше, не получая «+», альтернатива:

$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' `
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...