[CodeIgniter] 把 session 寫入db
2012 Dec 08 CodeIgniter
有些主機商很嚴格的管制 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 存取
就可以解決這個問題
ABOUT ME

路老闆 Louis
路老闆有限公司創辦人、Compassio 個人品牌一站式網站系統的開發者。二十年網站與行銷實戰經驗,長期陪伴講師、顧問與創作者把專業變成品牌。每週透過電子報與 Podcast《路老闆的個人品牌診療室》,分享個人品牌、網站經營與 AI 行銷的實務觀察。




如想留言評分,請先 登入會員!