【问题标题】:How to retrieve PHP exec() error responses?如何检索 PHP exec() 错误响应?
【发布时间】:2010-09-25 15:19:17
【问题描述】:

以下是我尝试执行的命令,但没有成功:

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess');

当你在最后添加一个 die() 时,它会发现有一个错误:

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess') or die('what?!');

对于上面的 exec() 语句,权限问题导致了错误,但 PHP 没有显示它。如何从 PHP 中显示发生了什么错误?

【问题讨论】:

    标签: php shell exec


    【解决方案1】:

    以下代码将捕获正常输出(来自 StdOut)和错误输出(来自 SdtErr)。

    exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess 2>&1',$output);
    var_dump($output);
    

    【讨论】:

    • 为我工作:)
    【解决方案2】:

    如果调用程序将输出输出到 STDERR,$output 参数似乎不起作用。

    处理此问题的更好方法是将输出从 exec 重定向到文件,然后在出现错误情况时显示该文件的内容。

    如果 $cmd 持有 exec 命令,则添加如下内容:

    $cmd.=" > $error_log 2>&1"
    

    然后检查 $error_log 中文件规范的内容,以获取有关命令失败原因的详细信息。

    另请注意,如果您在命令末尾使用 & 将其分叉,则立即检查 $error_log 的内容可能不会显示日志信息 - 脚本可能会在操作系统完成之前检查/处理文件.

    【讨论】:

      【解决方案3】:

      您可以通过传递可选的第二个参数来接收exec function 的输出结果:

      exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess',$output);
      var_dump($output);
      

      【讨论】:

      • $output 在这种情况下只会保存来自 sdtout 的输出,而不是来自 sdterr 的输出
      • 我得到一个空数组作为 $output,我知道有错误。
      【解决方案4】:

      这在几种情况下对我有用:

       ob_start();
       exec($cmd . " 2>&1", $output);
       $result = ob_get_contents();
       ob_end_clean();
       var_dump($output);
      

      " 2之间的空格很重要

      【讨论】:

      • 你是生命之神!
      • 谢谢,但您应该转储 $output[0] 以查看错误消息 :)
      • 为我工作。非常感谢。顺便说一句,您在变量 $output 中而不是在 $result 中得到错误。
      • @Brana 我已经编辑了答案以显示 $output 而不是 $result。
      【解决方案5】:

      这对我有用: 将 2>&1 附加到命令的末尾。

      在这里看到: php exec() not returning error message in output when executing svn command

      干杯

      【讨论】:

        【解决方案6】:

        如果通过第二个参数没有找到错误,可以通过命令搜索apache的错误日志,例如在Ubuntu Server 12.10 $尾/var/log/apache2/error.log 我正在从 php 运行一个 python 脚本,它的错误只打印在那里,因此我能够诊断它。 最好的问候。

        【讨论】:

        • 你真的救了我的命,哈哈。我对命令行和类似的东西很陌生!
        【解决方案7】:

        这不是您问题的直接答案,但如果您想知道返回的错误代码到底发生了什么,这非常有用。

        如果错误码($res),由命令返回:

        exec('command', $out, $res);
        

        在 1-2、126-165、255 范围内,而不是从 PHP 调用的 shell(例如 BASH)返回(以执行您的命令)。如果返回的代码不在此范围内,那么它是由您的命令(不是 shell)返回的。

        参见(有关 BASH 错误代码说明)

        https://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/exitcodes.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-09-21
          • 1970-01-01
          • 2015-04-03
          • 2016-12-22
          • 1970-01-01
          • 1970-01-01
          • 2011-03-17
          • 2023-03-11
          相关资源
          最近更新 更多