| 函數 | 作用範圍 | Session 檔案 | Session ID | $_SESSION 變數 |
|---|---|---|---|---|
| session_unset() | 當前腳本請求 | 保留 | 保留 | 釋放(清空陣列) |
| session_destroy() | 伺服器端持久儲存 | 刪除 | 釋放(失效) | 當前請求保留,下一請求無效 |
session_unset():下次請求 Session ID 仍有效,伺服器端檔案仍存在,資料可被恢復(安全風險)。session_destroy():當前請求 $_SESSION 仍可讀寫,邏輯判斷可能誤以為仍登入。<?php
session_start();
// 業務邏輯:記錄登出日誌等
// logActivity($userId, 'logout');
$_SESSION = array(); // 或 session_unset()
session_destroy(); // 刪除伺服器端數據
// 刪除客戶端 Cookie
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 3600,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
header('Location: login.php');
exit;
?>
<?php
// 使用自定義 Save Handler 時,session_destroy() 會自動調用 destroy 回調
// 手動強制刪除(如多應用共享 Session)
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->del('PHPREDIS_SESSION:' . session_id());
// 或使用 Redis SCAN 批量刪除用戶所有 Session(單點登出)
$pattern = "PHPREDIS_SESSION:*";
$iterator = null;
while ($keys = $redis->scan($iterator, $pattern, 100)) {
// 檢查 Session 數據中是否包含該 user_id
// 為效率建議 Session 數據結構化存儲 user_id 字段
}
?>
session_unset() 清理記憶體變數,session_destroy() 清理持久化存儲。完整登出必須雙雙調用,並刪除 Cookie。分散式環境需注意 Session 儲存後端的實際刪除行為。