Contents

CodeIgniter Session錯誤問題

CodeIgniter 的 Session 預設使用檔案方式儲存,在某些環境(特別是 Docker 容器)下可能因為路徑或權限問題導致 Session 無法正常運作,以下整理常見問題與解決方式。

Session 路徑設定

application/config/config.php 中設定 Session 儲存路徑:

1
2
// 設定 session 檔案存放目錄(相對於 BASEPATH)
$config['sess_save_path'] = BASEPATH . '../' . 'session_file';

或使用絕對路徑,更為明確:

1
$config['sess_save_path'] = '/var/www/html/session_file';

確保這個目錄存在,且 Web server 的執行使用者有寫入權限。

目錄權限設定

Session 目錄必須對 Web server 使用者(通常是 www-data)可寫:

1
2
3
4
5
6
# 建立目錄
mkdir -p session_file

# 設定權限
chmod 755 session_file
chown www-data:www-data session_file

若使用 Docker,則需要確認容器內的使用者身份,並給予對應權限。

Docker 環境的特殊注意事項

在 Docker 容器中,常見的 Session 問題包括:

  1. 容器重啟後 Session 檔案消失:Session 目錄若在容器內部(非 Volume),容器重啟後資料會消失。解決方式:將 Session 目錄掛載為 Docker Volume。

    1
    2
    3
    
    # docker-compose.yml
    volumes:
      - ./session_file:/var/www/html/session_file
    
  2. 權限不一致:Host 端掛載的目錄,使用者 UID 可能與容器內的 www-data 不同,導致無法寫入。

  3. 建議改用 Redis 或資料庫儲存 Session:在容器化環境中,File Session 較難管理,建議改用 Redis Session。

使用資料庫儲存 Session(更穩定)

1
2
$config['sess_driver'] = 'database';
$config['sess_save_path'] = 'ci_sessions'; // 資料表名稱

需要先建立 ci_sessions 資料表,CodeIgniter 文件中有提供對應的 SQL。

診斷步驟

  1. 確認 sess_save_path 指向的目錄存在
  2. 確認目錄對 Web server 使用者有讀寫權限(chmod 755777
  3. 查看 PHP error log 中是否有 Session 相關的錯誤訊息
  4. 若使用 Docker,確認 Session 目錄是否已掛載為 Volume

參考資料