兩函式行為不同,單獨呼叫都不足以完整清除 Session,必須依序執行才能徹底釋放伺服器與客戶端資源。
| 函式 | 記憶體 $_SESSION | Session 檔案 | Session ID |
|---|---|---|---|
session_unset() | 清空所有變數值 | 保留 | 保留 |
session_destroy() | 保留 (仍可讀取) | 刪除 | 釋放 (新請求產生新 ID) |
session_start();
session_unset(); // 1. 清空記憶體資料
session_destroy(); // 2. 刪除伺服器檔案、釋放 ID
setcookie(session_name(), '', time()-3600, '/'); // 3. 刪除客戶端 Cookie (可選)
header('Location: /login');
exit;
unset($_SESSION):僅銷毀區域變數,不影響 Session 儲存機制,下次請求資料仍在。session_destroy():$_SESSION 陣列仍保留舊值,若程式未重新 session_start() 直接讀取會誤判已登入。destroy 再 unset 會導致 session_unset() 找不到 Session 而噴 Warning。PHP 5.4 移除,舊代碼請改用 unset($_SESSION['key'])。
session_regenerate_id(true) 防 Session Fixation。$_SESSION['user_id'] 而非單檢查 isset($_SESSION)。session.cookie_secure=1、session.cookie_httponly=1、session.use_strict_mode=1。