開發模式與產品模式下的PHP報錯處理詳解

2020-07-16 10:04:21
程式報錯總是在所難免,儘管我們書寫程式碼時已經格外小心。

在開發php程式時,我們希望遇到php報錯,可以第一時間展示給我們,以便於偵錯。當程式開發完成,成為正式產品時,我們希望將沒有預測到的報錯資訊記錄到錯誤紀錄檔中,而不是將這些報錯資訊展示給使用者,因為使用者極有可能利用這些暴露出指令碼路徑、資料庫資訊或其他的報錯資訊進行一些破壞性的駭客行動。

PHP 的錯誤處理

php指令碼在執行過程中遇到錯誤將以報錯的形式處理,有些錯誤在報錯之後會終止指令碼繼續執行,而有些不會,具體請參閱手冊。

php的報錯處理方式根據以下設定選項進行,這些設定可以在程式碼中宣告以設定,也可以在php.ini檔案中設定。如果不需要經常改動這些設定,還是建議在php.ini檔案中設定,以使你的程式碼更清爽簡潔。

# 是否列印錯誤資訊到瀏覽器/命令列介面
# 開發模式下建議開啟,產品模式下強烈建議關閉
ini_set('display_errors', 'On');
# 是否記錄錯誤資訊到紀錄檔
# 開發模式和產品模式下都建議開啟
ini_set('log_errors', 'On');
# 指定錯誤資訊紀錄檔檔案,若開啟了 log_errors 選項,記得指定紀錄檔檔案位置
# 要確保執行 php 指令碼的系統使用者擁有該檔案的 write 許可權,否則紀錄檔無法被寫入
ini_set('error_log', '/usr/local/php/errors.log');
# 該選項用以設定錯誤報告的等級
# 等同於 error_reporting(E_ALL) 
# 無論開發模式還是產品模式下都建議開到E_ALL(報告所有的錯誤資訊)
# 產品模式下也需要設定此選項,因為關閉了 display_errors 並開啟了 log_errors
# 所以瀏覽器/命令列介面不會因此暴露報錯資訊
ini_set('error_reporting', E_ALL);

除此之外,php 還給開發者提供了在程式碼中將自定義的錯誤資訊記錄到錯誤紀錄檔檔案的內建函數:

bool error_log ( string $message [, int $message_type = 0 [, string $destination [, string $extra_headers ]]] )

必選引數是 message ,呼叫此函數會將 message 寫入 php.ini 中定義的 error_log 檔案中。

使用者自定義的錯誤處理

另外,使用者可以通過函數:

mixed set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] )

以自定義的方式來處理指令碼執行時出現的錯誤,如果使用者註冊了 error_handler 並指定了 error_types ,那麼當發生這些 error_types 的錯誤時,將繞過 php的標準錯誤處理程式

(也就是說既不會輸出錯誤資訊,也不會記錄錯誤資訊紀錄檔),而是執行 error_handler 中的處理程式。

該函數的詳細用法請參閱手冊(https://www.php.net/manual/zh/function.set-error-handler.php)

以上就是開發模式與產品模式下的PHP報錯處理詳解的詳細內容,更多請關注TW511.COM其它相關文章!