Warning: session_destroy(): Trying to destroy uninitialized session in ...
session_destroy() 必須在 session_start() 啟動 Session 之後呼叫。直接呼叫 session_destroy() 而未先 session_start() 會觸發此警告。
<?php
// 1. 必須最先啟動 Session
session_start();
// 2. 登出/清除邏輯
// 方式一:銷毀整個 Session(含伺服器端檔案)
session_destroy();
// 方式二:僅清除 Session 變數(保留 Session ID)
// $_SESSION = array();
// if (ini_get("session.use_cookies")) {
// $params = session_get_cookie_params();
// setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"]);
// }
// session_destroy(); // 最後再銷毀
// 3. 重導向
header("Location: login.php");
exit;
?>
| 錯誤寫法 | 問題 |
|---|---|
直接呼叫 session_destroy() | 未啟動 Session,無法銷毀 |
session_start() 在輸出之後 | headers already sent,Session 啟動失敗 |
多次 session_start() | PHP 7.1+ 會拋出 Notice,建議用 if (session_status() === PHP_SESSION_NONE) session_start(); |
銷毀後仍用 $_SESSION | 已銷毀的 Session 變數不可用 |
<?php
// 統一 Session 管理類
class SessionManager {
public static function start() {
if (session_status() === PHP_SESSION_NONE) {
// 安全設定
ini_set('session.cookie_httponly', 1);
ini_set('session.cookie_secure', isset($_SERVER['HTTPS'])); // HTTPS 才啟用
ini_set('session.use_strict_mode', 1);
session_start();
}
}
public static function destroy() {
self::start();
$_SESSION = [];
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
session_destroy();
}
public static function regenerate() {
self::start();
session_regenerate_id(true); // 刪除舊 session 檔案
}
}
// 登出頁面
SessionManager::destroy();
header("Location: /login.php");
exit;
?>
; php.ini 關鍵設定
session.save_handler = files
session.save_path = "/var/lib/php/sessions" ; 必須存在且 Web 使用者可寫
session.gc_maxlifetime = 1440
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.use_cookies = 1
session.use_only_cookies = 1
session.use_strict_mode = 1
session.cookie_httponly = 1
<?php
session_start();
echo "Session ID: " . session_id() . "
";
echo "Session Status: " . session_status() . "
"; // PHP_SESSION_ACTIVE=2
echo "Save Path: " . session_save_path() . "
";
echo "Cookie Params: "; print_r(session_get_cookie_params()); echo "
";
var_dump($_SESSION);
?>
記住鐵律:先 session_start(),才能 session_destroy()。登出流程建議「清空變數 → 刪除 Cookie → 銷毀 Session → 重導向」四步驟,確保徹底登出。