Почему приведенный ниже код php не возвращает ожидаемые значения? - PullRequest
0 голосов
/ 14 апреля 2009

Я пытаюсь создать несколько php-скриптов, которые будут запускаться, среди прочего, такими системными вызовами, как top и другие пользовательские скрипты. Вы можете увидеть код ниже очень просто. Проблема, с которой мы сталкиваемся с php ниже, заключается в том, что когда я вызываю php из приглашения linux, например:

#php checkTOP.php 

это вернет вывод top -n 1 на экране без проблем.

Когда я запускаю скрипт с веб-сервера, используя http://url.com/checkTOP.php, он возвращает только следующее:

программа: / usr / bin / top -n 1 ver1 = retval = 1 возвращается не ноль

Какие мои отладочные операторы.

<?php
        $program="/usr/bin/top -n 1";
        echo "program:{$program}<br /> \n";
        $ver1=system($program,$retval);
        echo "ver1 = {$ver1}<br />\n";
        echo "retval = {$retval}<br /> \n";
        if($retval==0)
        {
                echo "Returned 0<br />\n";
        }
        else
        {
                echo "Returned not zero <br />\n";
        }
        die;
?>

Изменение 1: еще одна вещь. Все разрешения установлены правильно / usr / bin / top установлен root: apache с rxrxrx, а также все каталоги /usr/bin.

Ответы [ 6 ]

2 голосов
/ 15 апреля 2009

Оле бил меня; Я использовал буферизацию вывода, поэтому выложу:

<code><?PHP
ob_start ();
$ program = "/ usr / bin / top -n 1 -b";
PassThru ($ программа);
$ Т = ob_get_contents ();
ob_end_clean ();
echo "<PRE>$t</PRE>"; ?>

1 голос
/ 14 апреля 2009

Один из способов получить вывод top - отправить ключ -b для запуска top в пакетном режиме и использовать exec (), чтобы получить вывод в массиве с одним элементом на строку.

<code><?php
exec('/usr/bin/top -n 1 -b',$output);
echo '<pre>',implode("\n",$output),'
';
1 голос
/ 14 апреля 2009

В зависимости от информации, которую вы хотите получить из системы, может быть более полезно и, безусловно, более безопасно собирать ее из / proc / filesystem.

Что вы пытаетесь получить от команды?

1 голос
/ 14 апреля 2009

Похоже, это проблема, связанная с учетными записями пользователей. Когда вы запускаете его из командной строки вручную, вы, вероятно, работаете под другим пользователем, чем веб-сервер пытается запустить как.

Что нужно проверить:

  • это Безопасный режим включен для PHP?
  • имеет ли пользователь, под которым работает веб-сервер (часто "www-data"), разрешение на выполнение top?
  • Вы можете включить более высокий уровень сообщений об ошибках , чтобы узнать, можете ли вы получить больше информации?
0 голосов
/ 15 апреля 2009

Команда top обычно не отправляет свой вывод на стандартный вывод. Вы не можете захватить его с помощью системной команды. Используйте опцию -b top для «пакетного режима», и он должен работать для вас.

$program="/usr/bin/top -b -n 1";

Когда вы запускаете его из приглашения linux, похоже, что оно работает, потому что вывод идет на дисплей. Когда я попробовал это, я заметил, что вывод не совсем соответствует тому, что я ожидал от команд echo. Это то, что подсказало мне, что в выводе было что-то странное, и проверка страницы руководства для top подтвердила флаг -b.

-
BMB

0 голосов
/ 15 апреля 2009

Похоже, что системная функция возвращает ошибку, и в этом случае, вероятно, значение равно нулю.

Если вы не можете получить системную команду, попробуйте использовать exec и посмотреть, работает ли она. Он также вернет вам все, что вы хотите, и я думаю также вернет сообщение об ошибке, чтобы помочь устранить проблему:

http://us3.php.net/manual/en/function.exec.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...