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

Posted

技术标签:

【中文标题】如何检索 PHP exec() 错误响应?【英文标题】:How to retrieve PHP exec() error responses? 【发布时间】: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 中显示发生了什么错误?

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何检索 PHP exec() 错误响应?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 android 中的改造从 php 中检索“字符串响应”?

如何从 Amazon SES 检索响应?

PHP 执行 exec 无响应,如果在cmd直接执行则几秒就执行完毕!求解决方法

从 AFNetworking 检索错误响应

使用 jquery AJAX 将数据发送到 php 并检索响应

如何从 MoyaError 获取错误响应