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 兩派,其餘選發佈順序晚的應該就差不多了。