error_reporting() 用於**設定或獲取當前腳本的錯誤報告等級**。它決定了哪些錯誤會被顯示、記錄或忽略。合理配置能讓開發期盡早發現問題,生產期避免敏感資訊洩露。
| 常數 | 數值 | 說明 |
|---|---|---|
| E_ERROR | 1 | 致命執行錯誤,腳本終止 |
| E_WARNING | 2 | 非致命執行警告,腳本繼續 |
| E_PARSE | 4 | 編譯期解析錯誤 |
| E_NOTICE | 8 | 執行期通知(如未定義變數) |
| E_CORE_ERROR | 16 | PHP 啟動時的致命錯誤 |
| E_CORE_WARNING | 32 | PHP 啟動時的警告 |
| E_COMPILE_ERROR | 64 | 編譯時致命錯誤 |
| E_COMPILE_WARNING | 128 | 編譯時警告 |
| E_USER_ERROR | 256 | 使用者觸發的致命錯誤 |
| E_USER_WARNING | 512 | 使用者觸發的警告 |
| E_USER_NOTICE | 1024 | 使用者觸發的通知 |
| E_STRICT | 2048 | 程式碼標準建議(PHP 5.4+ 已併入 E_ALL) |
| E_RECOVERABLE_ERROR | 4096 | 可被捕獲的致命錯誤 |
| E_ALL | 32767 | 所有錯誤與警告(PHP 5.4+ 包含 E_STRICT) |
; 開發環境:顯示所有錯誤,便於除錯 display_errors = On error_reporting = E_ALL ; 生產環境:隱藏錯誤細節,記錄至日誌 display_errors = Off log_errors = On error_log = /var/log/php_errors.log error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT
關鍵點:生產環境**絕不可**開啟 display_errors,防止資料庫連線資訊、路徑結構等敏感資料外洩。
<?php // 完全關閉錯誤報告(極不推薦,除非極特殊場景) error_reporting(0); // 僅報告嚴重錯誤 error_reporting(E_ERROR | E_WARNING | E_PARSE); // 報告所有錯誤(開發環境推薦) error_reporting(E_ALL); // 等同 E_ALL,但排除 NOTICE 與 DEPRECATED error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED); // 獲取當前等級 $currentLevel = error_reporting();
error_reporting(0) 能「修復」Bug:只是掩蓋症狀,真正的修復是修正代碼邏輯。log_errors 配置:生產環境若不記錄日誌,線上問題將無從追蹤。E_STRICT 與 E_DEPRECATED:前者建議更好寫法,後者警告即將移除功能,PHP 7+ 已大量清理。error_log 路徑:導致錯誤寫入 Web 伺服器預設日誌(如 Apache error.log),難以篩選。set_error_handler(function ($severity, $message, $file, $line) {
if (!(error_reporting() & $severity)) return false; // 尊重 error_reporting 設定
throw new ErrorException($message, 0, $severity, $file, $line);
});
set_exception_handler(function ($e) {
// 統一記錄、通知、回應友善錯誤頁面
error_log($e->getMessage());
http_response_code(500);
echo '系統繁忙,請稍後再試。';
});
掌握錯誤報告機制,是寫出健壯 PHP 應用的基石。建議在專案啟動檔(如 bootstrap.php)統一設定,避免分散在各處造成不一致。