如何检索PHP exec()错误响应?

时间:2008-12-06 02:39:14

标签: php shell exec

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

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

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

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

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

7 个答案:

答案 0 :(得分:19)

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

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

答案 1 :(得分:13)

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

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

如果$ cmd包含exec命令,则添加如下内容:

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

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

另请注意,如果你用&在命令结束时,立即检查$ error_log的内容可能不会显示日志信息 - 脚本可能会在操作系统完成之前检查/处理文件。

答案 2 :(得分:11)

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

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

答案 3 :(得分:7)

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

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

干杯

答案 4 :(得分:6)

这在几个场景中对我有用:

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

"之间的空格2 很重要

答案 5 :(得分:3)

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

答案 6 :(得分:1)

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

如果错误代码($ res),则通过命令返回:

./configure --prefix=/usr
make
make install

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

请参阅(有关BASH错误代码的说明)

  

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