在Docker容器中只logging来自PHP-FPM的真实致命错误
我在分离的Docker容器中使用PHP-FPM的NGINX。 我只想得到错误的stderr,以便我可以收集他们在一个集中的日志服务器上。 问题是:我使用WP,似乎有一些写得不好的插件。 他们的工作,但导致这样的警告:
PHP错误:7#7:* 1 FastCGI在stderr中发送:“PHP消息:PHP警告:参数1到wp_default_scripts()有望成为引用,/ www / wp中给出的值 – 在601行包括/ plugin.php
testing脚本示例,这应该会给stderr一个致命的错误:
<?php not_existing_func();
PHP-FPM被configuration为将错误logging到stderr中,如下所示:
[global] log_level = error error_log = /proc/self/fd/2
我想知道,这在上面的脚本没有给我什么。 就在我至lessnotice
了log_level
之后,我在docker容器的控制台上发现了exception:
[17-Jun-2017 01:45:35]警告:[pool www] child 8对stderr说:“注意:PHP消息:PHP致命错误:未捕获错误:调用/ www / x中的未定义函数not_existing_func()。 PHP:2"
为什么这是地狱呢? 对我来说,我们在这里显然有一个致命的错误,就像这个消息指出的,导致脚本无法继续(当然,我们在浏览器中会得到500错误)。 我不得不通过设置log_level
来notice
这样我才不会错过被警告的严重错误。 同时,我的日志充满垃圾警告从WordPress主题,插件等,我还没有开发,我不想修复更新的原因…
我试了一下,发现php.ini
中的log_errors
是PHP-FPM获取任何信息所必需的。 但是,来自error_reporting
的日志级别似乎也是有线的。 为了testing目的,我使用了以下configuration:
display_errors = Off log_errors = On error_log = /proc/self/fd/2 ;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR error_reporting = 0
结果:我收到了通知,但没有提供有关我致命错误的信息…
首先,我了解到我错了:Wordpress是这个问题的根源,而不是PHP直接。 这是一个众所周知的事实,当debugging启用WP操纵error_reporting
,所以我检查在我的configurationWP_DEBUG
为false
。 但是即使有这套, 文件说
除了“error_reporting”之外,如果WP_DEBUG被定义为false,WordPress会将其设置为4983。 […]
所以我的设置到php.ini
是正确和充足的。 我甚至不需要php-fpm设置,当错误被redirect到php.ini
文件中的标准输出。
如何防止WordPress操纵错误报告?
这也不是那么容易。 虽然WordPress的文档说, wp-config.php
是设置错误报告等全球范围设置的好地方,但他们后来被神覆盖到了4983
。 我不知道在哪里。 也许它甚至不是WordPress的核心,但一些不好开发的插件或主题。
我们可以通过将error_reporting
添加到禁用的函数来处理这个问题:
disable_functions = error_reporting
现在不可能覆盖我们的error_reporting
。 我认为这是最好的解决scheme,以确保我们没有得到任何其他错误报告的外部影响从插件或主题。 也在未来。 由于PHP允许这样的混乱,我们需要考虑这样的事情。
基本上,我们可以批评,这使得我们通过将WP_DEBUG
设置为true来获得更多的日志。 那就对了。 但是,由于我们在一个高效的系统上,对于我来说在这种方式下进行故障排除似乎是错误的。 我们不应该在应用程序的基础上做到这一点,特别是没有display_errors
! 相反,find问题的工作stream程应该是查看错误日志。
应该始终logging并检查致命错误。 如果这还不够,可以在更高级别上设置error_reporting
来获取有关可能的问题的信息,如警告。