正確配置 PHP 錯誤報告機制,能在開發期快速定位問題,在生產期避免敏感資訊洩露並保留審計線索。本文梳理 php.ini 核心指令與環境差異化建議。
| 指令 | 說明 | 推薦值(開發) | 推薦值(生產) |
|---|---|---|---|
display_errors | 是否在輸出中顯示錯誤 | On | Off |
display_startup_errors | PHP 啟動階段錯誤顯示 | On | Off |
error_reporting | 錯誤報告級別位掩碼 | E_ALL | E_ALL & ~E_DEPRECATED & ~E_STRICT 或 E_ALL |
log_errors | 是否記錄錯誤日誌 | On | On |
error_log | 錯誤日誌文件路徑(需可寫) | /var/log/php/error.log | /var/log/php/error.log |
log_errors_max_len | 單條日誌最大長度(0 不限制) | 1024 | 4096 |
ignore_repeated_errors | 忽略重複錯誤 | Off | On |
html_errors | 錯誤訊息包含 HTML 連結 | On | Off |
E_ERROR // 致命運行錯誤 E_WARNING // 運行警告(非致命) E_PARSE // 編譯時語法解析錯誤 E_NOTICE // 運行時通知(如未定義變數) E_DEPRECATED // 棄用功能警告 E_STRICT // 編碼標準建議 E_ALL // 所有錯誤(除 E_STRICT 外,PHP 5.4 前)
<?php
// 僅影響當前腳本
error_reporting(E_ALL & ~E_NOTICE); // 隱藏 Notice
ini_set('display_errors', '1'); // 開啟顯示(若 php.ini 允許覆寫)
// 自定義錯誤處理器(生產環境推薦)
set_error_handler(function($severity, $message, $file, $line) {
if (!(error_reporting() & $severity)) return false; // 不在報告級別內
error_log("[$severity] $message in $file:$line");
// 生產環境可發送郵件/推送至 Sentry 等
return true; // 不執行內建處理器
});
display_errors=On、error_reporting=E_ALL、html_errors=On,即時在瀏覽器看到完整堆疊。E_ALL,模擬生產行為但保留完整日誌。display_errors=Off、log_errors=On、error_log 指向專用文件/系統日誌、html_errors=Off、考慮 ignore_repeated_errors=On 減少日誌噪音。logrotate 定期切割 error_log,避免磁碟佔滿。php-fpm.conf 中 error_log)與 PHP 執行時錯誤日誌分離管理。