錯誤級別常量速查表
| 值 | 常量 | 說明 |
| 1 | E_ERROR | 致命運行時錯誤,腳本終止 |
| 2 | E_WARNING | 非致命運行時警告,腳本繼續 |
| 4 | E_PARSE | 編譯時解析錯誤 |
| 8 | E_NOTICE | 運行時通知(如未定義變量) |
| 16 | E_CORE_ERROR | PHP 啟動致命錯誤 |
| 32 | E_CORE_WARNING | PHP 啟動警告 |
| 64 | E_COMPILE_ERROR | 編譯致命錯誤 |
| 128 | E_COMPILE_WARNING | 編譯警告 |
| 256 | E_USER_ERROR | 用戶觸發致命錯誤 |
| 512 | E_USER_WARNING | 用戶觸發警告 |
| 1024 | E_USER_NOTICE | 用戶觸發通知 |
| 2048 | E_STRICT | 代碼規範建議(PHP 5.4+ 併入 E_ALL) |
| 4096 | E_RECOVERABLE_ERROR | 可捕獲致命錯誤 |
| 8191 | E_ALL | 所有錯誤(含 E_STRICT,PHP 6.0+) |
環境別推薦配置
; 開發環境 php.ini
error_reporting = E_ALL
display_errors = On
display_startup_errors = On
log_errors = On
error_log = /var/log/php_dev_errors.log
; 生產環境 php.ini
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /var/log/php_prod_errors.log
; 關鍵:生產環境絕不向用戶顯示錯誤詳情
運行時動態設置
<?php
// 開發調試
error_reporting(E_ALL);
ini_set('display_errors', '1');
// 生產環境入口文件
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT);
ini_set('display_errors', '0');
ini_set('log_errors', '1');
ini_set('error_log', '/var/log/php_errors.log');
// 自定義錯誤處理器(記錄到數據庫/監控系統)
set_error_handler(function($errno, $errstr, $errfile, $errline) {
if (!(error_reporting() & $errno)) return false; // 尊重 error_reporting 設置
$log = "[$errno] $errstr in $errfile:$errline";
error_log($log);
// 生產環境返回友好頁面
if (in_array($errno, [E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_RECOVERABLE_ERROR])) {
http_response_code(500);
include __DIR__ . '/templates/500.html';
exit();
}
return true; // 繼續內部處理器
});
// 捕獲致命錯誤
register_shutdown_function(function() {
$error = error_get_last();
if ($error && in_array($error['type'], [E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR])) {
// 記錄致命錯誤
error_log("FATAL: {$error['message']} in {$error['file']}:{$error['line']}");
}
});
?>
常見誤區與避坑
- 使用
error_reporting(0) 屏蔽所有錯誤 → 會掩蓋致命錯誤,導致白屏無日誌,排查極難。
- 生產環境開啟
display_errors → 洩露路徑、數據庫結構、代碼邏輯等敏感信息。
- 忽略 E_DEPRECATED → 升級 PHP 版本時代碼大面積報警,建議專項清理而非屏蔽。
- 未設置
error_log → 錯誤信息丟失在系統日誌中,難以追蹤。
現代工具輔助
- 靜態分析:PHPStan、Psalm、PHP CodeSniffer 捕獲潛在錯誤。
- 異常監控:Sentry、Rollbar、Bugsnag 實時告警、堆棧追蹤、版本關聯。
- 日誌聚合:ELK (Elasticsearch+Logstash+Kibana) / Loki+Grafana 集中查詢分析。