首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

CodeIgniter 錯誤日誌完整配置與最佳實踐指南

     編輯:PHP 綜合知識

CI 工作流程與錯誤處理入口

所有請求經 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不記錄
1ERROR (PHP 錯誤、資料庫錯誤、自定 log_message('error', ...))
2DEBUG (框架內部除錯資訊、SQL 查詢、自定 'debug')
3INFO (資訊級、自定 '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'];

五、隱藏 index.php 與靜態資源路由 (關鍵避坑)

.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">

六、資料傳遞:Controller → View → Model

1. Controller → View (標準方式)

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() 解包)。

2. Model → Controller → View

// 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);

3. 避免 Model 直接操作 View

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 含結尾斜線

總結

  1. 啟用 log_threshold = 1,設定安全的 log_path
  2. 善用 log_message('error|debug|info', $msg) 記錄關鍵業務節點
  3. .htaccess 必須排除靜態資源目錄,否則 CSS/JS/圖片全掛
  4. base_url 設正確、以 / 結尾,視圖統一用 base_url()
  5. 配置模組化:$this->config->load('mysetting') 管理第三方 Key
  6. MVC 分層嚴守:Model 不碰 View,Controller 組裝資料

遵循此指南,即可建立可觀測、可維護、生產就緒的 CodeIgniter 應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved