如何检索 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 中检索“字符串响应”?
PHP 执行 exec 无响应,如果在cmd直接执行则几秒就执行完毕!求解决方法