首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

PHP Session 存儲至 MySQL 實現分佈式會話共享完整方案

     編輯:MySQL 資料庫相關知識

Session 工作原理回顧

  1. 首次啟動生成唯一 Session ID,存入客戶端 Cookie(默認 PHPSESSID)
  2. session_start() 從存儲介質加載數據填充 $_SESSION
  3. session_register() / 直接操作 $_SESSION 註冊變量
  4. 腳本結束時,未銷毀數據自動序列化寫回存儲介質(默認文件系統,路徑由 session.save_path 控制)

文件存儲瓶頸與三大替代方案

方案優點缺點
文件分層目錄實現簡單I/O 瓶頸無法根治,inode 耗盡風險
MySQL 數據庫持久化、支持集群、便於查詢審計、跨節點共享寫入延遲略高於內存
Redis/Memcached極高性能、原生 TTL、集群擴展性強需額外運維組件、數據持久化風險

本文採用折中方案:Session 入 MySQL,兼顧共享與運維簡單度。

數據庫表設計

CREATE TABLE `session` (
  `session_id` VARCHAR(128) NOT NULL PRIMARY KEY,
  `session_data` TEXT NOT NULL,
  `session_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Session 表結構示意

核心實現:自定義存儲處理器

通過 session_set_save_handler() 註冊六個回調函數:

ini_set("session.save_handler", "user");
ini_set("session.gc_probability", 1);
ini_set("session.gc_divisor", 2);          // 50% 概率觸發 GC
ini_set("session.gc_maxlifetime", 1440);   // 24 分鐘過期

session_set_save_handler("open", "close", "read", "write", "destroy", "gc");

六大回調函數實現要點

  • open():建立 DB 連接,類構造函數
  • close():關閉連接,類析構函數,在 write 後調用
  • read($id):查詢 session_data,返回序列化字符串(空串表示無數據),PHP 自動反序列化填充 $_SESSION
  • write($id, $data):INSERT ... ON DUPLICATE KEY UPDATE 寫入/更新,session_time 用於 GC 判斷
  • destroy($id):DELETE 對應記錄,session_destroy() 或 session_regenerate_id(true) 觸發
  • gc($maxlifetime):DELETE WHERE NOW() - session_time > maxlifetime,概率觸發

完整代碼見原文,關鍵注意:

  1. 使用 mysql_connect 而非 PDO/mysqli(舊版本兼容),生產建議升級
  2. write 回調在輸出流關閉後執行,調試輸出需寫文件
  3. 序列化格式需與 session.serialize_handler 一致(默認 php,非 serialize())

Session 生命周期圖解

  1. session_start() → 讀 Cookie PHPSESSID
  2. 調用 read() 獲取數據 → 反序列化 → 填充 $_SESSION
  3. 業務邏輯操作 $_SESSION(純內存操作)
  4. 腳本結束 → 未調用 session_destroy() → 調用 write() 持久化
  5. 調用 session_destroy() → 調用 destroy() 刪除記錄 → 不再 write()

生產環境優化建議

  • 連接池:使用持久連接或連接池避免頻繁建連
  • 異步寫入:write 推入消息隊列,後台異步落庫,降低請求延遲
  • 壓縮:session_data 較大時考慮 gzcompress
  • 監控:定期統計表大小、GC 效率、慢查詢
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved