【问题标题】:PHP - Calling .php file from command line produces no outputPHP - 从命令行调用 .php 文件不会产生输出
【发布时间】:2010-07-12 07:59:45
【问题描述】:

我有一个简单的 cmd.php 页面来运行我使用 shell_exec () 输入的命令并显示输出。

  • PHP 正在作为 CGI 运行
  • 输入“php -v”,大多数命令只会显示“Content-type: text/html”,然后是当前页面的 HTML 源代码。
  • 但是,使用无效参数 (/usr/bin/php -z) 调用 PHP 会显示 PHP 的使用情况:

    用法:php [-q] [-h] [-s] [-v] [-i] [-f ] php [参数...]

    等等……

我附上了几张图片来说明我的意思。

PHP -v 没有产生预期的输出

PHP -z 显示PHP的用法

有什么想法吗?

编辑

cmd.php

<?php

    if ( isset ( $_POST['submit'] ) ) :

        $response = shell_exec ( escapeshellcmd ( stripslashes ( $_POST['cmd'] ) ) );

    endif;

?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <style type="text/css">
            pre#response { border: 1px solid #e0e0e0; padding: .5em; }
        </style>
        <title>Command</title>
    </head>
    <body>
        <form action="cmd.php" method="post">
            <p><input type="text" name="cmd" id="cmd" value="<?php echo @htmlspecialchars ( stripslashes ( $_POST['cmd'] ) ); ?>" size="50" />
            <button type="submit" name="submit" id="submit" value="Submit">Submit</button>
            </p>
        </form>


        <?php
        if ( isset ( $response ) ) :
        ?>

            <pre id="response"><?php

                if ( empty ( $response ) ) :
                    echo 'No response.';
                else :
                    echo htmlspecialchars ( $response );
                endif;
            ?></pre>

        <?php
        endif;
        ?>

    </body>
</html>

【问题讨论】:

  • 预期输出是什么?我们可以看看 cmd.php 吗?
  • 它应该显示版本号...我发布了源代码。
  • 您的 FCGI 或 CGI 是否通过包装脚本在 chroot 中运行?
  • 不确定您的意思...您看到了我在上面使用的所有代码。

标签: command-line php


【解决方案1】:

shell_exec() 只返回已写入执行进程的stdout的字符,不返回stderr。试试redirecting stderr to stdout,这样错误消息将存储在 $response 中。

<?php
define('REDIRECT_STDERR', 1);

if ( isset ( $_POST['submit'] ) ) :      
  $cmd = escapeshellcmd ( stripslashes ($_POST['cmd']) );
  if ( defined('REDIRECT_STDERR') && REDIRECT_STDERR ) :
    $cmd .= ' 2>&1';
  endif;
  $response = shell_exec( $cmd );
endif;

?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <style type="text/css">
      pre#response { border: 1px solid #e0e0e0; padding: .5em; }
    </style>
    <title>Command</title>
  </head>
  <body>
    <form action="cmd.php" method="post">
      <p>
        <input type="text" name="cmd" id="cmd" value="<?php echo @htmlspecialchars ( stripslashes ( $_POST['cmd'] ) ); ?>" size="50" />
        <button type="submit" name="submit" id="submit" value="Submit">Submit</button>
      </p>
    </form>


    <?php if ( isset ( $cmd ) ) : ?>
    <fieldset><legend><?php echo htmlspecialchars($cmd); ?></legend>
      <pre id="response"><?php var_dump($repsonse); ?></pre>
    </fieldset>
    <?php endif; ?>
  </body>
</html>

【讨论】:

    【解决方案2】:

    请从命令行检查 php 使用的 php.ini。我有同样的问题(php命令行没有输出),尝试用php.ini-production替换当前的php.ini,命令行php开始正常工作。最近的 php 版本(从 5.3.10 升级到 5.4.3)似乎修改了一些配置变量。

    【讨论】:

      猜你喜欢
      • 2015-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      相关资源
      最近更新 更多