【问题标题】:PHP system(), exec(), and shell_exec() not returning outputPHP system()、exec() 和 shell_exec() 不返回输出
【发布时间】:2021-06-19 19:05:20
【问题描述】:

我想找到 MySQL 的正确路径。但是,此命令的输出为空。根据 PHP 的 exec() 命令手册,该命令应该捕获 shell 命令的输出。

<?php
$cmd = "which mysql 2>&1;";
print($cmd."<br>");
exec($cmd, $output, $retval);
var_dump($output);
print("<br>");
var_dump($retval);
?>

输出:

which mysql 2>&1;
array(0) { }  
int(1)

命令行输出:

$ which mysql 2>&1;
/usr/local/mysql/bin/mysql

为什么命令出错?为什么变量不包含错误的输出,因为命令指定了2&gt;&amp;1

【问题讨论】:

  • “发生了什么”是什么意思? php.net/manual/en/function.exec.phpphp.net/manual/en/function.shell-exec.php 几乎涵盖了这一点。 shell_exec 根本不捕获输出,并且 exec 不捕获输出除非你告诉它。所以...只需阅读文档并更新您的代码以使用您需要的函数,并使用正确的参数?
  • 从 PATH 开始迭代的意义何在?这就是 shell 已经在做的事情了。更好。
  • 如果网络服务器 PATH 不包含 /usr/local/we/love/obtuse/nested/paths/,那么这就是您的配置问题。
  • 我已经修改了代码和问题,以便您能够更好地理解。

标签: php system shell-exec php-7.4


【解决方案1】:

我认为问题不在于你没有得到执行命令的输出,而是which 找不到mysql。 使用exec可以获取命令的返回状态,其中0表示成功,其他值表示错误。

$output = exec($cmd, $output, $retval);
var_dump($output);
var_dump($retval);

如果$retval1,则意味着which 找不到mysql 二进制文件,并返回一个空行。

【讨论】:

  • 谢谢,我添加了捕获返回值,它是“1”,所以有错误。但是,终端命令有效并返回 MySQL 路径。
  • 您在终端中运行的which 命令可能与PHP 得到的PATH 配置不同。您可以通过在终端中运行echo $PATH 的输出与PHP 代码中getenv('PATH') 的输出进行比较。但这超出了这个问题的范围。
  • 是的,这正是问题所在。 @mario 的上述评论也说明了这一点。
猜你喜欢
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
相关资源
最近更新 更多