为什么下面的PHP代码没有返回预期的值?

时间:2009-04-14 16:59:19

标签: php linux bash scripting

我正在尝试制作一些PHP脚本,这些脚本将在其他系统调用命令(如top和其他自定义脚本)之间运行。您可以看到下面的代码非常简单。我们在下面的php中遇到的问题是,当我从linux提示符调用php时:

#php checkTOP.php 

它将返回屏幕中的顶部-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 with rxrxrx以及所有目录/ usr / bin。

6 个答案:

答案 0 :(得分:2)

奥莱打败了我;我使用了输出缓冲,所以我会发布它:

<?PHP
ob_start();
$program="/usr/bin/top -n 1 -b";
passthru($program);
$t=ob_get_contents();
ob_end_clean();
echo "<PRE>$t</PRE>"; ?>

答案 1 :(得分:1)

听起来这是与用户帐户相关的问题。当您从命令行手动运行它时,您可能在不同于Web服务器尝试运行的用户下运行。

要检查的一些事项:

  • 是否为PHP启用了Safe Mode
  • 网络服务器运行的用户(通常是“www-data”)是否有权执行top
  • 你可以打开更高的error reporting level来查看是否可以获得更多信息吗?

答案 2 :(得分:1)

根据您要从系统收集的信息,从/ proc / filesystem收集信息可能更有用,也更安全。

你想从命令中得到什么?

答案 3 :(得分:1)

获得最高输出的一种方法是将-b开关发送到批处理模式下运行顶部,并使用exec()在数组中输出每行一个元素。

<?php
exec('/usr/bin/top -n 1 -b',$output);
echo '<pre>',implode("\n",$output),'</pre>';

答案 4 :(得分:0)

看起来系统函数返回失败,在这种情况下retval可能为null。

如果你无法获得系统命令,你可以尝试使用exec并查看它是否有效。它还会为您提供所需的一切,我认为它还会返回错误消息以帮助调试问题:

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

答案 5 :(得分:0)

top命令通常不会将其输出发送到stdout。您无法使用system命令捕获它。使用-b选项顶部为“批处理模式”,它应该适合您。

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

当你从linux提示符运行它时,看起来它正在工作,因为输出进入显示。当我尝试它时,我注意到输出与我对echo命令的预期不完全匹配。这就是让我感到惊讶的是输出有些奇怪,并且检查了top页面确认了-b标志。

-
BMB