Session 是 PHP 維持用戶狀態的核心機制。本文系統整理 session_start、session_register、session_unregister、session_is_registered、session_destroy、session_encode/session_decode、session_regenerate_id 等函式,並提供 5 個完整實戰範例,涵蓋初始化、變數管理、安全銷毀、編碼儲存、ID 重生成等常見場景。
| 函式 | 用途 | 備註 |
|---|---|---|
| session_start() | 啟動或恢復 Session | 必須在輸出前呼叫 |
| session_register($name) | 註冊全域變數到 Session(已棄用) | PHP 5.4+ 移除,改用 $_SESSION |
| session_unregister($name) | 取消註冊(已棄用) | 改用 unset($_SESSION[$name]) |
| session_is_registered($name) | 檢查是否已註冊(已棄用) | 改用 isset($_SESSION[$name]) |
| session_destroy() | 銷毀所有 Session 資料 | 不刪除 $_SESSION 陣列本身 |
| session_encode() | 將 Session 資料序列化為字串 | 格式:name|value;... |
| session_decode($data) | 解析 session_encode 字串並填入 $_SESSION | 需先 session_start() |
| session_regenerate_id($delete_old=false) | 產生新 Session ID,可選刪除舊檔案 | 防止 Session Fixation 攻擊 |
session_start();
// 清空所有 Session 變數
$_SESSION = array();
// 刪除 Session Cookie
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time() - 42000, '/');
}
// 徹底銷毀 Session
session_destroy();
關鍵點:銷毀需三步驟:清空 $_SESSION、刪除 Cookie、呼叫 session_destroy()。
session_start();
$a = 5;
session_register('a'); // 註冊 $a 到 $_SESSION
session_decode("some|serialized|data"); // 解析字串填入 $_SESSION
print(session_is_registered('a') ? $_SESSION['a'] : 'not registered');
警告:session_register 等函式已移除,現代專案請直接操作 $_SESSION 超全域陣列。
session_start();
$_SESSION['login_ok'] = true;
$_SESSION['nome'] = 'sica';
$_SESSION['inteiro'] = 34;
$result = session_encode(); // 序列化
echo $result; // 輸出:login_ok|b:1;nome|s:4:"sica";inteiro|i:34;
session_destroy(); // 銷毀
session_start();
$_SESSION['name'] = "yoursession";
if (!isset($_SESSION['initiated'])) {
session_regenerate_id(true); // 產生新 ID 並刪除舊 Session 檔案
$_SESSION['initiated'] = true;
}
session_destroy();
最佳實踐:用戶登入成功、權限變更時呼叫 session_regenerate_id(true),防止 Session Fixation。
session_start();
$_SESSION['name'] = "yoursession";
if (isset($_SESSION['name'])) { // 現代寫法
echo "指定的變數已經被註冊為 session<br>";
} else {
echo "指定的變數沒有被註冊為 session<br>";
}
session_destroy();
session_register 等舊函式。php.ini 設定 session.cookie_httponly=1、session.cookie_secure=1(HTTPS)、session.use_strict_mode=1。SessionHandlerInterface 將 Session 存入 Redis、Memcached、資料庫,支援分散式部署。session.gc_maxlifetime 並配合 session_set_cookie_params 控制 Cookie 存活期。session_start() 前是否有輸出(含 BOM、空白字元),或 session.save_path 目錄權限。session.cookie_domain = ".example.com"。session.gc_probability/gc_divisor 垃圾回收機率、多伺服器環境是否共享儲存。Session 是 PHP 狀態管理的基石。雖然舊式 session_register 等函式已棄用,但理解其演進歷程有助於維護舊專案。現代開發應完全轉向 $_SESSION 超全域陣列,並配合安全設定、自訂儲存處理器、ID 再生成等最佳實踐,構建健壯的用戶狀態管理系統。