Session 變數是 PHP 跨頁面保持用戶狀態的核心工具。本文系統整理 Session 完整生命週期操作,包含啟動、寫入、讀取、計數器範例、刪除單一變數與銷毀整個 Session,並說明常見陷阱。
必須在任何 HTML 輸出前 呼叫 session_start(),否則會觸發 "headers already sent" 警告。
<?php session_start(); ?>
<html><body>...</body></html>
使用超全域陣列 $_SESSION(PHP 4.1.0+),勿使用已棄用的 session_register()。
<?php
session_start();
// 寫入
$_SESSION['views'] = 1;
// 讀取
echo "Pageviews = " . $_SESSION['views'];
?>
<?php
session_start();
if (isset($_SESSION['views'])) {
$_SESSION['views']++;
} else {
$_SESSION['views'] = 1;
}
echo "Views = " . $_SESSION['views'];
?>
| 操作 | 函式/語法 | 效果 |
|---|---|---|
| 刪除單一變數 | unset($_SESSION['views']) | 移除指定鍵值,其他資料保留 |
| 清空所有變數 | $_SESSION = []; (PHP 5.4+) 或 session_unset() | 保留 Session ID,資料歸零 |
| 徹底銷毀 Session | session_destroy() | 刪除伺服器端儲存檔案與 Session ID Cookie,不會 立即清除 $_SESSION 變數 |
<?php
session_start();
// 1. 清空陣列
$_SESSION = [];
// 2. 刪除 Session Cookie(預設名稱 PHPSESSID)
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
// 3. 銷毀伺服器端資料
session_destroy();
header("Location: login.php");
exit;
?>
$_SESSION → 無效且產生 Notice。output_buffering。$_SESSION 仍存在,需手動清空。session.cookie_httponly=1、session.cookie_secure=1(HTTPS)、session.use_strict_mode=1。預設使用檔案系統(session.save_handler = files),高併發或分散式架構建議改用 Redis/Memcached:
ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://127.0.0.1:6379?auth=password');
或實作 SessionHandlerInterface 自訂資料庫儲存。