首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP session_unset 與 session_destroy 差異深度解析與完整登出實作

     編輯:PHP 綜合知識

核心差異對比

函數作用範圍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;
?>

進階:分散式 Session 登出(Redis/Memcached)

<?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 儲存後端的實際刪除行為。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved