2011-04-12 38 views
6

我一直在使用set_error_handler來覆蓋默認的PHP錯誤處理,唯一的目的是自定義錯誤日誌記錄。但我得出的結論是,人們無法自定義錯誤日誌並記錄所有可能的錯誤。是否自定義PHP日誌記錄和記錄所有可能的錯誤互斥?

1)可以使用的set_error_han dler() - 但此功能,引自PHP手冊: E_ERROR,E_PARSE,E_CORE_ERROR, E_CORE_WARNING:

以下錯誤類型不能 與用戶定義的函數來處理,E_COMPILE_ERROR, E_COMPILE_WARNING,最 E_STRICT

這樣的 - 通過走這條路 - 您的自定義日誌將不會有記錄這些錯誤?

2)第二種方法是使用register_shutdown_function(),然後運行error_get_last()得到錯誤...但是 - error_get_last() ...僅獲取最後一個錯誤......雖然你可能有腳本執行期間多次警告和注意事項 - 這種方法只會允許您記錄最近的錯誤,通知,警告 - 對嗎?

所以 - 恕我直言 - 我沒有看到任何解決方法。看起來像是想要擁有最完整的錯誤日誌 - 應該堅持默認的PHP記錄器 - 對吧?

+0

「自定義錯誤記錄」是什麼意思?只是不同的日誌格式/地點或一些更多的邏輯取決於它? – Laimoncijus 2011-04-12 19:59:03

+0

好。我打算將它們保存到數據庫中。但我還沒有到那個地步。 – Stann 2011-04-12 20:13:51

回答

2

1)那是正確的。它的原因是這個錯誤會阻止整個php進程正常工作,所以它不會讓軟件恢復正常。但是,如果你編寫軟件,那會很難實現,除了日誌記錄之外,你還有其他問題。

2)目前似乎是正確的。但你也有這個set_error_handler()

4

第二種方法是用register_shutdown_function(),然後運行error_get_last()獲取錯誤...但是 - error_get_last()......僅獲取最後一個錯誤

權,但如果它是一個錯誤類型,殺死了腳本,它確實是關閉功能中的正確錯誤。以防萬一,您可以檢查數組中返回的type鍵作爲可捕獲類型之一。如果它可能被另一個錯誤處理程序捕獲,則不採取任何行動。

FWIW,我也從來沒有看到E_CORE_ERRORE_CORE_WARNINGE_COMPILE_ERRORE_COMPILE_WARNING發生在現實世界中。大多數編譯錯誤都是解析錯誤。