首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

優化版 MySQL 儲存 Session 類:合併統計、單一 SQL、記憶體引擎與 GC 接口

     編輯:PHP 綜合知識

設計目標

  1. Session 處理與訪問統計合併,遊客亦記錄。
  2. 純資料庫 + Cookie 模擬 Session,不依賴檔案系統。
  3. 單次請求最多一條 SQL(讀或寫),無 Session 操作時零查詢。
  4. 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 攻擊。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved