CodeIgniter 透過 index.php 定義 ENVIRONMENT 常數,根據環境自動設定 error_reporting() 等級,無需在控制器中分散控制。
<?php
// index.php 關鍵片段
define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');
/*
*---------------------------------------------------------------
* ERROR REPORTING
*---------------------------------------------------------------
*/
if (defined('ENVIRONMENT')) {
switch (ENVIRONMENT) {
case 'development':
// 開發環境: 顯示所有錯誤 (含 Notice、Deprecated)
error_reporting(E_ALL);
break;
case 'testing':
case 'production':
// 測試/生產環境: 隱藏所有錯誤 (記錄到 log)
error_reporting(0);
break;
default:
exit('The application environment is not set correctly.');
}
}
?>
| 環境 | error_reporting | 顯示錯誤 | 記錄錯誤 | 適用階段 |
|---|---|---|---|---|
| development | E_ALL | 開啟 (螢幕顯示) | 啟寫入 logs/ | 本地開發、除錯 |
| testing | 0 | 關閉 | 啟用 | 自動化測試、Staging |
| production | 0 | 關閉 | 啟用 | 正式上線 |
<?php
// index.php - 替換預設 switch 區塊
if (defined('ENVIRONMENT')) {
switch (ENVIRONMENT) {
case 'development':
// 開發: 顯示所有但不顯示 Deprecated (PHP 8.1+ 大量棄用警告)
error_reporting(E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED);
ini_set('display_errors', '1');
ini_set('log_errors', '1');
ini_set('error_log', APPPATH . 'logs/php_errors.log');
break;
case 'testing':
// 測試: 僅顯示致命錯誤,記錄所有
error_reporting(E_ERROR | E_PARSE | E_CORE_ERROR | E_COMPILE_ERROR);
ini_set('display_errors', '0');
ini_set('log_errors', '1');
break;
case 'production':
// 生產: 完全不顯示,只記錄嚴重錯誤
error_reporting(E_ERROR | E_PARSE | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR);
ini_set('display_errors', '0');
ini_set('log_errors', '1');
ini_set('error_log', '/var/log/php/app_errors.log'); // 系統級日誌
break;
}
}
?>
| 方式 | 設定範例 | 優先級 |
|---|---|---|
| Web 伺服器環境變數 | Apache: SetEnv CI_ENV productionNginx + PHP-FPM: fastcgi_param CI_ENV production; | 最高 (不改代碼) |
| .htaccess (Apache) | SetEnv CI_ENV development | 高 |
| PHP 程式碼判斷 | define('ENVIRONMENT', 'development'); (index.php 直接寫死) | 中 |
| 預設值 | 無環境變數時預設 'development' | 最低 |
var_dump(ENVIRONMENT); 驗證ini_get('display_errors') === '0'chmod 755 writable/logs/、擁有者為 PHP-FPM 使用者application/views/errors/html/error_php.php 避免洩露堆疊追蹤set_exception_handler() 統一捕獲未處理例外CI_ENV 環境變數是否正確傳遞給 PHP-FPM (Nginx 需 fastcgi_param)log_threshold 在 config.php 設為 1 (記錄錯誤)、log_path 可寫入& ~E_DEPRECATED 或升級代碼修正棄用用法index.php 最早期設定,框架載入前.env 檔案管理環境:CI_ENVIRONMENT = productionConfig\Exceptions 類別配置,更靈活