設計目標
- Session 處理與訪問統計合併,遊客亦記錄。
- 純資料庫 + Cookie 模擬 Session,不依賴檔案系統。
- 單次請求最多一條 SQL(讀或寫),無 Session 操作時零查詢。
- GC(垃圾回收)分離提供介面,不阻塞正常請求。
資料表結構(MEMORY 引擎,高速)
CREATE TABLE `prefix_session` (
`sid` char(32) NOT NULL,
`uid` int(10) NOT NULL,
`username` char(32) NOT NULL,
`usertype` tinyint(1) NOT NULL,
`activetime` int(10) NOT NULL,
`expiry` int(10) NOT NULL,
`ip` char(15) NOT NULL,
`url` char(80) NOT NULL,
`value` char(255) NOT NULL, -- serialize() 後的陣列
PRIMARY KEY (`sid`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8;
核心類別結構
class session {
private $_sessionPrex, $_time, $_model, $_expiry=1200, $_domain;
protected $isNew=0, $session=[];
public function __construct($options) { ... }
public function start() { $this->_getSid(); }
public function set($key, $value) { ... } // 區分核心欄位與自訂值
public function get($key) { ... }
public function gc($file, $time=1200) { ... } // 檔案鎖控制頻率
public function destroy() { ... } // 邏輯刪除 + Cookie 清除
public function __destruct() { $this->_save(); } // 請求結束自動持久化
private function _save() { ... } // INSERT 或 UPDATE 單一 SQL
private function _getSession($sid) { ... } // 讀取並反序列化
private function _getSid() { ... } // 從 Cookie 取得或建立新 SID
private function _setCookie($name,$value,$expiry=0) { ... }
private function _getip() { return getip(); }
}
關鍵優化點
- MEMORY 引擎:資料全在記憶體,讀寫極快,重啟自動清空無需手動 GC。
- 單一 SQL 寫入:
__destruct 統一執行 INSERT(新)或 UPDATE(舊),避免多次往返。
- 延遲載入:
start() 只有在真正需要 Session 時才查詢資料庫。
- GC 非阻塞:透過檔案時間戳控制執行頻率(如每 20 分鐘),
DELETE WHERE activetime+expiry < NOW() 清理過期資料。
使用範例
$sess = new session([
'model' => $db, // 已連線的 DB 模型實例
'sessionPrex' => 'myapp',
'expiry' => 1800,
'domain' => '.example.com'
]);
$sess->start();
$sess->set('uid', 123);
$sess->set('cart', ['item1'=>2, 'item2'=>1]);
// 請求結束自動儲存
注意事項
- 程式碼為架構示範,需配合具體 DB 模型介面(
insert()、update()、detail()、delete())調整。
value 欄位限制 255 字元,大量自訂資料請改用 JSON/資料表關聯儲存。
- 生產環境建議加入
session_id() 重生成機制防止 Session Fixation 攻擊。