專案上線後,即時掌握錯誤資訊至關重要。PHP 內建的 set_error_handler() 允許開發者攔截錯誤並自訂處理邏輯。本文示範如何建立一個錯誤處理函數,將錯誤編號、訊息、檔案、行號及當時變數內容整理成 HTML 郵件寄送給開發人員。
function nettuts_error_handler($number, $message, $file, $line, $vars) {
$email = "<p>An error ($number) occurred on line $line and in the file: $file.</p>";
$email .= "<p>$message</p>";
$email .= "<pre>" . print_r($vars, true) . "</pre>";
$headers = 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
error_log($email, 1, 'you@youremail.com', $headers);
// 非 E_NOTICE 且非嚴重錯誤時終止腳本
if (($number !== E_NOTICE) && ($number < 2048)) {
die("有錯誤,請稍後再試!");
}
}
set_error_handler('nettuts_error_handler');
// 測試:觸發未定義變數錯誤
echo $somevarthatdoesnotexist;
$vars 包含當時作用域內所有變數,利用 print_r($vars, true) 轉為字串。Content-type: text/html 使郵件支援排版。E_NOTICE,且僅對錯誤代碼小於 2048(即 E_ERROR, E_WARNING, E_PARSE 等)才終止執行,避免因小錯誤導致服務中斷。set_error_handler('nettuts_error_handler') 將自訂函數掛入 PHP 錯誤處理流程。error_log() 依賴本地 MTA,生產環境建議改用 PHPMailer 或 SwiftMailer 透過 SMTP 發送,確保送達。$vars 中的密碼、Token 等敏感欄位。透過簡單的自訂錯誤處理器,即可將 PHP 執行期錯誤即時推送至信箱,大幅縮短問題發現與修復的時間。結合上述進階策略,可構建更健壯的錯誤監控體系。