首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 入門

PHP 錯誤處理與日誌記錄完整指南

     編輯:PHP 入門

PHP 錯誤處理與日誌記錄完整指南


簡介

PHP 提供完整的錯誤處理與日誌機制:自訂錯誤處理器、例外處理器、觸發使用者錯誤、記錄至檔案/系統日誌/郵件、錯誤報告層級控制、顯示/隱藏錯誤等。所有函數內建核心,無需安裝。


執行期設定 (php.ini 關鍵指令)

指令預設值說明可變範圍
error_reportingNULL設定錯誤報告層級 (數值或常數)PHP_INI_ALL
display_errors"1"是否將錯誤輸出到畫面 (生產環境應關閉)PHP_INI_ALL
display_startup_errors"0"啟動階段錯誤是否顯示 (建議關閉)PHP_INI_ALL
log_errors"0"是否記錄錯誤到伺服器日誌或 error_logPHP_INI_ALL
log_errors_max_len"1024"錯誤日誌最大長度 (0 為不限)PHP_INI_ALL
ignore_repeated_errors"0"不記錄重複錯誤 (同檔同行)PHP_INI_ALL
ignore_repeated_source"0"忽略重複來源PHP_INI_ALL
report_memleaks"1"顯示記憶體洩漏資訊PHP_INI_ALL
track_errors"0"最後一個錯誤存入 $php_errormsgPHP_INI_ALL
html_errors"1"錯誤訊息包含 HTML 標籤PHP_INI_ALL
error_logNULL指定錯誤日誌檔案路徑 (需 Web 使用者可寫)PHP_INI_ALL

核心函數

函數說明PHP 版本
error_reporting()設定/取得錯誤報告層級4
set_error_handler()設定使用者自訂錯誤處理函數4
restore_error_handler()恢復上一個錯誤處理器4
set_exception_handler()設定使用者自訂例外處理函數5
restore_exception_handler()恢復上一個例外處理器5
trigger_error() / user_error()觸發使用者自訂錯誤/警告/通知4
error_log()發送錯誤到伺服器日誌、檔案或遠端4
error_get_last()取得最後發生的錯誤資訊陣列5
debug_backtrace()生成回溯追蹤陣列4
debug_print_backtrace()列印回溯追蹤5

錯誤層級常數

值常數說明PHP 版本
1E_ERROR執行期致命錯誤,腳本終止
2E_WARNING執行期非致命警告
4E_PARSE編譯期解析錯誤
8E_NOTICE執行期通知 (潛在問題)
16E_CORE_ERRORPHP 啟動致命錯誤4
32E_CORE_WARNINGPHP 啟動警告4
64E_COMPILE_ERROR編譯致命錯誤 (Zend 引擎)4
128E_COMPILE_WARNING編譯警告4
256E_USER_ERROR使用者觸發致命錯誤4
512E_USER_WARNING使用者觸發警告4
1024E_USER_NOTICE使用者觸發通知4
2048E_STRICT程式碼相容性建議5
4096E_RECOVERABLE_ERROR可捕獲的致命錯誤 (可由 set_error_handler 處理)5
6143E_ALL所有錯誤與警告 (PHP 6 起包含 E_STRICT)5

最佳實踐範例

1. 開發環境完整錯誤顯示

<?php
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
?>

2. 生產環境記錄不顯示

<?php
ini_set('display_errors', '0');
ini_set('log_errors', '1');
ini_set('error_log', '/var/log/php/error.log');
error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
?>

3. 自訂錯誤處理器 (將錯誤轉為例外)

<?php
function exceptionErrorHandler($severity, $message, $file, $line) {
    if (!(error_reporting() & $severity)) return;
    throw new ErrorException($message, 0, $severity, $file, $line);
}
set_error_handler('exceptionErrorHandler');

try {
    // 程式碼...
} catch (ErrorException $e) {
    error_log($e->getMessage());
    // 友善錯誤頁面
}
?>

4. 記錄自訂錯誤到檔案

<?php
error_log("訂單處理失敗: OrderID=$orderId", 3, "/var/log/app/orders.log");
?>

關鍵建議

  • 生產環境 絕不 開啟 display_errors,避免洩露敏感資訊。
  • 統一使用例外處理,配合 set_exception_handler 進行全域捕獲與記錄。
  • 日誌檔案權限確保 Web 使用者可寫,並定期輪轉 (logrotate)。
  • 使用 error_get_last() 在關閉腳本前檢查致命錯誤 (register_shutdown_function)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved