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

Mat*_*att 28 php shell exec

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

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess');
Run Code Online (Sandbox Code Playgroud)

当您在末尾添加die()时,它会捕获到错误:

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess') or die('what?!');
Run Code Online (Sandbox Code Playgroud)

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

Era*_*rin 19

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

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess',$output);
var_dump($output);
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,$ output只保存sdtout的输出,而不是来自sdterr (16认同)
  • 我得到空数组作为 $output 并且我知道有错误。 (3认同)

S.o*_*.ov 15

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

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

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

$cmd.=" > $error_log 2>&1"
Run Code Online (Sandbox Code Playgroud)

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

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


Ama*_*nut 14

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

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


小智 7

这对我有用:在你的命令结尾附加2>&1.

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

干杯


Dav*_*d L 6

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


Bon*_*ich 6

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

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

"2之间的空间很重要

  • 你是生命之神! (2认同)