ThinkPHP 預設將 Session 儲存在檔案系統,分散式部署或高併發場景下建議改用資料庫儲存。本文以 ThinkPHP 3.1.2 為例,示範完整設定流程。
<?php
define('APP_DEBUG', true);
require '../ThinkPHP/ThinkPHP.php';
ini_set("session.save_handler", "user"); // 關鍵:告知 PHP 使用使用者定義處理器
?>
<?php
return [
'SHOW_PAGE_TRACE' => true,
'DB_TYPE' => 'mysql',
'DB_HOST' => 'localhost',
'DB_NAME' => 'thinkphp',
'DB_USER' => 'your_username',
'DB_PWD' => 'your_password',
'DB_PORT' => 3306,
'DB_PREFIX' => 'think_',
// Session 資料庫儲存設定
'SESSION_OPTIONS' => [
'type' => 'db', // 使用資料庫驅動
'expire' => 1440, // 過期秒數
],
'SESSION_TABLE' => 'think_session', // 必須含前綴,否則找不到表
];
?>
框架內建 SessionDb.class.php 提供 DDL,執行以下 SQL:
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;
訪問專案首頁,然後在 phpMyAdmin 查看 think_session 表,應會出現一筆 Session 記錄。此後所有 session('name', 'value') 操作將自動讀寫資料庫。
ini_set("session.save_handler", "user") 讓 PHP 呼叫 session_set_save_handler() 註冊的回調函數SessionDb 類別實作 open/close/read/write/destroy/gc 介面SessionDb,無需手動引入InnoDB 支援行級鎖session_id 已建立唯一索引,大量資料可考慮分表或改用 Redis/MemcachedSESSION_TABLE 與資料庫即可共享 Session完成以上設定,ThinkPHP 即可無縫切換至資料庫 Session 儲存,支援叢集部署與 Session 持久化需求。