【问题标题】:Why the php code below is not returning the expected values?为什么下面的 php 代码没有返回预期值?
【发布时间】:2010-10-19 09:48:17
【问题描述】:

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

#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。

【问题讨论】:

  • Ole J. Helgesen,Eddy,您的两个答案都很好。我只是不想选择一个答案而不是另一个。我将等待一些投票来选择正确的答案。谢谢你们俩。

标签: php linux bash scripting


【解决方案1】:

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

需要检查的一些事项:

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

【讨论】:

  • 安全模式已关闭。我使用以下命令 sudo -u apache php checkTOP.php 运行了 php checkTOP.php 并且它有效。我正在调查报告级别。谢谢。
【解决方案2】:

根据您想从系统收集的信息,从 /proc/ 文件系统收集信息可能更有用,当然也更安全。

你想从命令中得到什么?

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

        • 或者你可以蜷缩起来
        【解决方案6】:

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

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

        当您从 linux 提示符下运行它时,它看起来像是在工作,因为输出会显示在显示器上。当我尝试它时,我注意到输出与我对 echo 命令的预期不太匹配。这就是让我知道输出有些奇怪的原因,并且检查顶部的手册页确认了 -b 标志。

        --
        bmb

        【讨论】:

          猜你喜欢
          • 2014-11-17
          • 1970-01-01
          • 1970-01-01
          • 2017-07-09
          • 2019-09-17
          • 2021-01-03
          • 2015-03-21
          • 1970-01-01
          • 2017-12-16
          相关资源
          最近更新 更多