[CodeIgniter] 把 session 寫入db

未分類
有些主機商很嚴格的管制 session 寫入次數

我想是因為 session 操作很吃主機資源吧...









最近越來越常遇到這類的主機

(尤其是客人自己亂買的)

(不過也不乏台灣主流市場的主機)



有時候明明下了 session 寫入的指令

再讀出來就是沒變

最常遇到的狀況就是出現在購物車

產品怎麼加入購物車都沒用



一開始也不曉得是什麼問題

傻傻的去翻 CodeIgniter 的 library

debug了半天還是不知道哪裡出問題









偶然翻到 CodeIgniter 可以把內建的 session function

改成寫入到資料庫

方法很簡單



首先

在 db 開一個 table





CREATE TABLE IF NOT EXISTS  `ci_sessions` (

    session_id varchar(40) DEFAULT '0' NOT NULL,

    ip_address varchar(45) DEFAULT '0' NOT NULL,

    user_agent varchar(120) NOT NULL,

    last_activity int(10) unsigned DEFAULT 0 NOT NULL,

    user_data text NOT NULL,

    PRIMARY KEY (session_id),

    KEY `last_activity_idx` (`last_activity`)

);






table name 是 ci_sessions

table name 可以自己改成別的名字 是ok的

底下會進一步說明









第二步就是在 application/config/config.php 中找到





$config['sess_use_database'] = FALSE;



把它改成





$config['sess_use_database'] = TRUE;





即可





之後 CodeIgniter 的 Session 類別


就會透過 db 去存取 自己的 session 資料





如果要改資料庫名稱


可以找到這行





$config['sess_table_name'] = 'ci_sessions';





把紅色的 table name 改成自己想要的名稱即可


記得 db 的 table 也是要這個名字


不然會無法讀寫















這樣一改


可以解決不少問題





第一點就是


不管主機商怎麼亂改 session 的設定


你都不用擔心 因為你的 session 其實是


透過 CodeIgniter 的 Session Library 寫到 db 去的



(但是php原生的 session library 還是不會寫到db去喔)



第二點是

當你的網站規模變大的時候 (我也好想規模變大阿)

可以解決多部主機 session 同步的問題

因為如果以原生php session的方式

session 是以檔案的方式存在主機中

要透過使用網路硬碟的方式才能多台 web server 同步

如果使用 db 當做 session 存取

就可以解決這個問題