CodeIgniter 社群的 Session library 數量很多,而且越來越多 …… 之前我選用 OB Session 不料沒多久作者便離開 CI 轉乘 Kohana,害我現在想換 lib 又不曉得要換哪支了。

  session API cookie 內容 資料庫 已應用於
CI_session CI   所有資料 選用  
DB Session CI 獨立 (1.5) SID 必須 auth, FreakAuth
OB Session CI 取代 (1.5) SID (db) 選用  
NG Session CI 取代 (1.6) SID (db) 選用  
PHPSession PHP 獨立 (無) SID    
Native Session PHP 取代 (1.5) SID   sentry
RA session PHP 獨立 (1.5) SID   RA Auth
KNDB Session PHP 取代 (1.6) SID 選用  
※ 非官方資料,2008-04-03 製表。詳細如下述:
  • session

    CI_session 會建立自己的 session 資料(而非使用 PHP 既有的 $_SESSION 變數),瀏覽器必須啟用 cookie,而且會失去 $_SESSION 的某些特徵(後述)。這邊表格填 CI 就表示使用 CI 的 session,填 PHP 則是使用 PHP 的 $_SESSION。

  • API

    獨立表示單獨的 library,例如 DB Session 要以 $this->db_session 存取;取代表示直接覆蓋 CI 的 Session 類別,所以程式寫法除了新增功能(例如 flashdata)之外沒有改變。

    後面加註的是最接近的 CI 版本號,由於 CI 1.6 才正式新增 flashdata 功能和 sess_time_to_update(重新產生 session id)選項,所以舊的 lib 使用前可能需要修改才會與 CI_session 一致。註:即使版本相符,還是要留意選項歧義,例如 OB Session 的 session_expiration 設為 0 有特殊意義。

  • cookie 內容

    一般 session 只會把 SID (session id) 存進 cookie,但是 CI_session 會把所有資料都存進去,拿到 cookie 的壞人就有機會解出資料內容。

    表格填 SID 表示只會把 SID 放進 cookie;填 SID (db) 表示若用資料庫儲存資料,cookie 內容就只會放 SID(若沒資料庫,還是會全放 cookie)。

    另外 PHP 的 $_SESSION 在沒有 cookie 支援時仍可以用 URL 來傳 SID,只是這邊的 lib 除了 PHPSesson 在原始碼好像沒看到之外,都還是設計為需要 cookie 支援的。即使可以使用基於 URL(禁用 cookie)的 session,CodeIgniter 也要稍微修改才能用網址傳 SID 吧。

  • 資料庫

    把 session 資料存在資料庫。CI_session 僅儲存 SID, ip_address 等資料,以用於驗證;其他 lib 會更進一步將 session->set_userdata 設的資料存入名為 session_data 的 text 欄位。

    另外,雖然只有 KNDB Session 提供類似標準 CI 的選用資料庫選項,但其他基於 PHP $_SESSION 的 lib 似乎也能由 php.ini 的 session.save_handler 指定用資料庫儲存資料。

  • 已應用於

    記錄該 library 已被包含於哪些認證用的 library

最後看來,這些 lib 主要就分 CI Session 和 PHP Session 兩派,其餘選發佈順序晚的應該就差不多了。