所有請求經 index.php → system/core/CodeIgniter.php 引導,核心類依序載入:Exceptions (錯誤處理)、Config、Router、Output、Controller 等。錯誤日誌由 Exceptions 類與 log_message() 函數協作完成。
config.php
$config['log_threshold'] = 1; // 0=關閉, 1=錯誤, 2=除錯, 3=資訊, 4=所有 $config['log_path'] = APPPATH . 'logs/'; // 預設應用目錄下 logs/ $config['log_file_permissions'] = 0644; $config['log_date_format'] = 'Y-m-d H:i:s';
閾值說明:
| 值 | 記錄層級 |
|---|---|
| 0 | 不記錄 |
| 1 | ERROR (PHP 錯誤、資料庫錯誤、自定 log_message('error', ...)) |
| 2 | DEBUG (框架內部除錯資訊、SQL 查詢、自定 'debug') |
| 3 | INFO (資訊級、自定 'info') |
| 4 | 所有層級 |
生產環境建議:設為 1 (僅錯誤) 或 2 (含除錯),避免日誌爆量。
// 控制器/模型/庫中任意處
log_message('error', '資料庫連線失敗:' . $e->getMessage());
log_message('debug', 'API 請求參數:' . print_r($_GET, true));
log_message('info', '用戶登入:UID=' . $uid . ', IP=' . $this->input->ip_address());
日誌檔案命名:log-YYYY-MM-DD.php,格式為 PHP 陣列回傳,可直接 include 讀取。
預設 application/logs/ 可能被 Web 訪問,建議移至公開目錄外:
// config.php $config['log_path'] = '/var/log/ci_app/'; // 絕對路徑,需寫入權限
或運行時動態修改:
$this->config->set_item('log_path', '/custom/path/logs/');
建立 application/config/mysetting.php:
$config['api_key'] = 'sk_live_xxx'; $config['partner_id'] = 12345;
載入與使用:
$this->config->load('mysetting'); // 自動合併到 $this->config
$key = $this->config->item('api_key'); // 取得值
// 或一次性載入快取
$this->config->load('mysetting', true); // 第二參數 true 返回陣列不合併
$arr = $this->config->item('mysetting');
自動載入:autoload.php → $autoload['config'] = ['mysetting'];
.htaccess (專案根目錄)
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|assets|uploads|robots\.txt|favicon\.ico)
RewriteRule ^(.*)$ index.php/$1 [L]
關鍵點:RewriteCond $1 !^(assets|uploads|...) 排除靜態資源目錄,否則 CSS/JS/圖片會被重寫導致 404。
config.php
$config['base_url'] = 'https://example.com/'; // 必須以 / 結尾 $config['index_page'] = ''; // 隱藏 index.php $config['uri_protocol'] = 'REQUEST_URI'; // 推薦
視圖中引用靜態資源
<script src="<?=base_url('assets/js/app.js')?>"></script>
<link href="<?=base_url('assets/css/style.css')?>" rel="stylesheet">
public function index() {
$data = [
'title' => '首頁',
'articles' => $this->Article_model->getLatest(10),
'sidebar' => $this->load->view('partials/sidebar', [], true), // 捕獲子視圖
];
$this->load->view('home', $data);
}
視圖中直接用 $title, $articles (經 extract() 解包)。
// Model
public function getLatest($limit) {
return $this->db->order_by('created_at', 'DESC')->limit($limit)->get('articles')->result_array();
}
// Controller
$data['articles'] = $this->Article_model->getLatest(10);
$this->load->view('home', $data);
Model 僅負責資料邏輯,Controller 負責協調與組裝視圖資料,維持 MVC 分層。
application/views/errors/html/error_404.php、error_general.php 等可自訂樣式。
註冊自訂異常處理器:
// application/core/MY_Exceptions.php
class MY_Exceptions extends CI_Exceptions {
public function show_404($page = '', $log_error = true) {
// 記錄 404 到資料庫/外部服務
log_message('error', '404 Not Found: ' . $_SERVER['REQUEST_URI']);
parent::show_404($page, $log_error);
}
}
| 現象 | 原因 | 解決 |
|---|---|---|
| logs/ 目錄無檔案 | log_threshold=0 或目錄無寫入權限 | 設 threshold≥1、chmod 755 logs/、擁有者 www-data |
| 日誌內容為空/亂碼 | PHP 錯誤被 error_reporting 隱藏 | index.php 設 error_reporting(E_ALL) |
| 靜態資源 404 | .htaccess 未排除 assets/ uploads/ | 加入 RewriteCond 排除條件 |
| base_url() 輸出錯誤 | config['base_url'] 未設或無結尾 / | 設完整 URL 含結尾斜線 |
log_threshold = 1,設定安全的 log_pathlog_message('error|debug|info', $msg) 記錄關鍵業務節點base_url 設正確、以 / 結尾,視圖統一用 base_url()$this->config->load('mysetting') 管理第三方 Key遵循此指南,即可建立可觀測、可維護、生產就緒的 CodeIgniter 應用。