完善的錯誤處理是專業 PHP 應用程式的標誌。預設情況下,PHP 會直接將錯誤訊息輸出至瀏覽器,包含檔案名、行號與描述,這在生產環境中既不專業又存在安全風險。本文深入探討 PHP 錯誤處理的核心機制與最佳實踐。
最簡單的錯誤處理方式是在關鍵操作前檢查條件,失敗時終止腳本:
<?php
if (!file_exists("welcome.txt")) {
die("檔案不存在");
} else {
$file = fopen("welcome.txt", "r");
}
?>
雖然有效,但直接終止腳本並非總是最佳方案,尤其在複雜應用中需要更靈活的控制。
自定義錯誤處理器是一個函數,需接受至少兩個參數(錯誤層級、錯誤訊息),最多可接受五個參數:
function errorHandler($errno, $errstr, $errfile, $errline, $errcontext)
| 值 | 常數 | 說明 |
|---|---|---|
| 2 | E_WARNING | 非致命執行時警告,不暫停腳本 |
| 8 | E_NOTICE | 執行時通知,可能發生錯誤也可能正常 |
| 256 | E_USER_ERROR | 使用者產生的致命錯誤 |
| 512 | E_USER_WARNING | 使用者產生的非致命警告 |
| 1024 | E_USER_NOTICE | 使用者產生的通知 |
| 4096 | E_RECOVERABLE_ERROR | 可捕獲的致命錯誤 |
| 8191 | E_ALL | 所有錯誤與警告 |
<?php
function customError($errno, $errstr) {
echo "Error: [$errno] $errstr
";
echo "腳本結束";
die();
}
set_error_handler("customError");
// 測試觸發錯誤
echo $undefinedVariable;
?>
在使用者輸入驗證等場景中,可主動觸發特定層級的錯誤:
<?php
$test = 2;
if ($test > 1) {
trigger_error("變數值必須小於等於 1", E_USER_WARNING);
}
?>
搭配自定義處理器可實現針對性錯誤處理:
<?php
function customError($errno, $errstr) {
echo "Error: [$errno] $errstr
";
echo "腳本結束";
die();
}
set_error_handler("customError", E_USER_WARNING);
$test = 2;
if ($test > 1) {
trigger_error("變數值必須小於等於 1", E_USER_WARNING);
}
?>
預設情況下 PHP 依據 php.ini 設定記錄錯誤至伺服器日誌。使用 error_log() 可將錯誤發送至指定檔案或遠端目的地:
<?php
function customError($errno, $errstr) {
echo "Error: [$errno] $errstr
";
echo "已通知網站管理員";
error_log("Error: [$errno] $errstr", 1, "admin@example.com", "From: webmaster@example.com");
}
set_error_handler("customError", E_USER_WARNING);
$test = 2;
if ($test > 1) {
trigger_error("變數值必須小於等於 1", E_USER_WARNING);
}
?>
建議:常規錯誤應使用預設 PHP 日誌系統記錄於伺服器,僅對關鍵錯誤採用郵件通知,避免郵件風暴。
E_ALL 顯示所有錯誤