以下是我尝试执行的命令,但没有成功:
exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess');
当你在最后添加一个die()时,它会发现有一个错误:
exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess') or die('what?!');
对于上面的exec()语句,权限问题导致错误,但PHP没有显示它。你如何从PHP中显示出现了什么错误?
答案 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