默認情況下 PHP 的 Session 數據存儲在服務器文件系統中,但在分佈式部署、負載均衡等場景下,將 Session 存入數據庫可實現多服務器間的 Session 共享。本文基於 ThinkPHP 3.1.2 版本,詳細說明配置步驟。
在 index.php 中啟用調試模式並設置 Session 處理器為用戶自定義:
<?php
define('APP_DEBUG', true); // 開啟調試模式
require '../ThinkPHP/ThinkPHP.php'; // 載入框架入口
ini_set("session.save_handler", "user"); // 關鍵:設置 Session 由用戶定義處理
?>
在 config.php 中配置數據庫連接及 Session 存儲參數:
<?php
return array(
'SHOW_PAGE_TRACE' => true,
// 數據庫配置
'DB_TYPE' => 'mysql',
'DB_HOST' => 'localhost',
'DB_NAME' => 'thinkphp',
'DB_USER' => '你的用戶名',
'DB_PWD' => '你的密碼',
'DB_PORT' => 3306,
'DB_PREFIX' => 'think_',
// Session 數據庫存儲配置
'SESSION_OPTIONS' => array(
'type' => 'db', // 使用數據庫存儲
'expire' => 1440, // 過期時間(秒),默認讀取 php.ini 設置
),
'SESSION_TABLE' => 'think_session', // 必須包含表前綴,否則找不到表
);
?>
在 MySQL 中執行以下 SQL 創建表結構(基於框架內置 SessionDb.class.php 的 DDL):
CREATE TABLE `think_session` (
`session_id` varchar(255) NOT NULL,
`session_expire` int(11) NOT NULL,
`session_data` blob,
UNIQUE KEY `session_id` (`session_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
完成上述配置後,訪問 index.php,隨後在 phpMyAdmin 中查看 think_session 表,會發現已自動寫入 Session 記錄。之後在代碼中使用標準方法即可:
// 寫入 Session
session('session_name', 'session_value');
// 讀取 Session
$value = session('session_name');
系統會自動將數據存入配置的數據庫表中,無需額外代碼。
ThinkPHP 內置的 SessionDb.class.php 實現了 SessionHandlerInterface 接口,通過 session_set_save_handler() 註冊自定義的 open、close、read、write、destroy、gc 方法,實現數據庫存儲。框架會自動加載此類,開發者只需配置即可。
SESSION_TABLE 必須包含配置的表前綴(如 think_session),否則框架無法定位表。