簡體   English   中英

在 Docker 容器中僅記錄來自 PHP-FPM 的真正致命錯誤

[英]Log only real fatal errors from PHP-FPM in Docker container

我在單獨的 Docker 容器中使用 NGINX 和 PHP-FPM。 我只想將錯誤發送到 stderr,以便我可以在集中式日志服務器上收集它們。 問題是:我正在使用 WP,並且似乎有一些寫得不好的插件。 他們工作,但會導致這樣的警告:

2017/06/17 01:16:08 [error] 7#7: *1 FastCGI 在 stderr 中發送:“PHP 消息:PHP 警告:wp_default_scripts() 的參數 1 應為參考,值在 /www/wp 中給出-includes/plugin.php 第 601 行

用於測試的示例腳本,它應該在 stderr 中給我一個致命錯誤:

<?php
not_existing_func();

PHP-FPM 被配置為將錯誤記錄到 stderr,如下所示:

[global]
log_level = error
error_log = /proc/self/fd/2

我想知道這在上面的腳本中沒有給我任何內容。 就在我將log_level切換到至少notice ,我在 docker 容器的控制台上收到了異常:

[17-Jun-2017 01:45:35] 警告:[pool www] child 8 對 stderr 說:“注意:PHP 消息:PHP 致命錯誤:未捕獲錯誤:調用 /www/x 中未定義的函數 not_existing_func()。 php:2"

為什么這是一個通知 對我來說,我們在這里顯然有一個致命錯誤,如消息所示,導致腳本無法繼續(當然,我們在瀏覽器中收到 500 錯誤)。 我必須設置log_levelnotice這樣我就不會錯過被聲明為警告的致命錯誤,這不可能是真的。 同時,我的日志中充滿了來自 wordpress 主題、插件等的垃圾警告,這些警告是我尚未開發的,並且由於更新原因我不想修復......

我嘗試了一下,發現php.ini中的log_errors對於 PHP-FPM 獲取任何信息至關重要。 但是error_reporting的日志級別似乎也連接了。 出於測試目的,我使用了以下配置:

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 直接原因。 眾所周知,WP 在啟用調試時會操縱error_reporting ,因此我嘗試在我的配置中將WP_DEBUG定義為false 但即使有這個設置,文檔說

[...] 除了 'error_reporting',如果 WP_DEBUG 定義為 false,WordPress 會將其設置為 4983。 [...]

所以我在php.ini中的設置是正確和足夠的。 當錯誤被重定向到php.ini文件中的 stdout 時,我什至不需要php-fpm設置。

如何防止WordPress操縱錯誤報告?

這也不是那么容易。 盡管 WordPress 文檔說wp-config.php是設置全局設置(如錯誤報告)的好地方,但它們后來被覆蓋到4983 我不知道在哪里; 也許它甚至不是 Wordpress 的核心,而是一些開發不佳的插件或主題。

我們可以通過向禁用的函數添加error_reporting來解決這個問題:

disable_functions = error_reporting

現在不可能覆蓋我們的error_reporting 我認為這是確保我們不會因插件或主題的外部影響而收到任何其他錯誤報告的最佳解決方案。 同樣在未來,既然PHP允許這樣的混亂,我們需要考慮這樣的事情。

基本上,我們可以批評這通過將WP_DEBUG設置為 true 來阻止我們獲取更多日志,這是正確的,但是由於我們在生產系統上,因此以這種方式進行故障排除對我來說似乎是錯誤的。 我們不應該在應用程序基礎上這樣做,尤其是沒有display_errors 相反,查找問題的工作流程應該是查看錯誤日志。

應始終定期記錄和檢查致命錯誤。 如果這還不夠,可以在更高級別設置error_reporting以獲取有關警告等可能問題的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM