PHP exec()在输出中没有返回错误信息。

50

我试图以XML格式获取svn命令的某些输出。当我输入有效参数时,输出是正确的。但是,当我输入错误的密码时,输出不会显示错误消息。 这是 PHP 代码:

exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/', $output);

这是我在终端中获得的输出:

<?xml version="1.0"?>
<log>
svn: OPTIONS of 'http://a51.unfuddle.com/svn/a51_activecollab': authorization failed: Could not authenticate to server: rejected Basic challenge (http://a51.unfuddle.com)

这是我使用var_dump打印$output变量得到的输出结果:

array(2) {
[0]=>
string(21) "<?xml version="1.0"?>"
[1]=>
string(5) "<log>"
}

你可以看到,$output变量没有返回终端的第三行输出。请帮我获取与终端相同的输出(我甚至尝试使用shell_exec()或system()方法,但它们返回与exec()相同的输出)。我如何获取完整的输出? 提前感谢您的帮助!

3个回答

90

你需要一起捕获stderr

stderr重定向到stdout即可。在你的命令末尾添加2>&1

例如:

exec("/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/ 2>&1", $output);

如果是一个复杂的命令(例如带有管道的命令,比如将mysqldump导出并传递给gzip,然后重定向到文件mysqldump ... | gzip > db.sql.gz),则创建一个子shell来捕获整个标准错误并将其重定向到标准输出:

exec('( error_command | cat >/dev/null ) 2>&1', $output)
#     ^                                ^   ^
#     `-- sub-shell with the command --´   `-- stderr to $output

14
顺便说一句,PHP的exec方法为什么没有提供一种简单的方式来单独捕获stderr输出,这不是很奇怪吗? - Stephen C
@StephenC: 第一眼看起来可能是这样,但当您了解为什么有两个不同的流程(一些民间传说)并且知道 PHP 具有 SAPI 和错误处理时,这就更有意义了。例如,在 CLI 中执行该代码时,您可以直接在终端中看到错误 - 无论程序需要处理的输出是什么。或者,如果它在 php-fpm 中运行,则可以在服务器日志中获得错误报告。对于运行系统来说,这不是一个坏的默认设置。 - hakre

0

那可能不是解决方案,只是一个糟糕的建议:你尝试在命令中添加额外的echo了吗:

exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/;**echo ""**', $output);

另一种解决方法就是如已经提到的:如果在 $output 中没有最后一行,它仍然会在 exec() 函数的返回值中。 那么你就会有
$totalOutput = push($msg,$output);

使用

$msg = exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/', $output);

-3

你需要定义一个变量来存储消息

$msg = exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/');


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接