39

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

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

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

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

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

4

7 回答 7

27

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

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess 2>&1',$output);
var_dump($output);
于 2016-10-27T20:44:02.803 回答
20

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

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

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

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

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

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

于 2014-06-06T21:52:46.897 回答
19

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

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

" 2之间的空间很重要

于 2017-04-13T08:53:11.700 回答
18

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

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess',$output);
var_dump($output);
于 2008-12-06T02:44:55.333 回答
10

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

在这里看到: 执行 svn 命令时,php exec() 未在输出中返回错误消息

干杯

于 2015-11-08T20:56:46.990 回答
7

如果通过第二个参数没有找到错误,可以搜索apache的错误日志,例如在Ubuntu Server 12.10中通过命令 $ tail /var/log/apache2/error.log 我正在运行一个python脚本来自 php,其错误仅在此处打印,因此我能够对其进行诊断。最好的祝福。

于 2012-12-01T23:51:29.447 回答
2

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

如果错误代码($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

于 2018-07-18T11:03:43.470 回答