session_start() 建立/恢復會話
2. 產生唯一 Session ID(預設 PHPSESSID)
3. ID 透過 Cookie 或 URL 傳遞
4. 伺服器以 ID 為鍵讀寫資料(檔案/資料庫/Redis)
5. 請求結束自動序列化儲存
...
關鍵: 必須在 <html>、空白、BOM 之前呼叫,否則 Headers already sent 錯誤。
session.auto_start = On 可自動啟動,但不建議(效能、控制權)。
// 寫入 $_SESSION['user_id'] = 123; $_SESSION['cart'] = ['item1', 'item2']; // 讀取 $userId = $_SESSION['user_id'] ?? null; $cart = $_SESSION['cart'] ?? [];
// page1.php - 存入
session_start();
if ($_POST['season']) {
$_SESSION['season'] = $_POST['season'];
header("Location: page2.php");
exit;
}
// 表單略
// page2.php - 讀取
session_start();
$season = $_SESSION['season'] ?? '未設定';
switch ($season) {
case '春天': echo '綠意盎然'; break;
case '夏天': echo '熱情四溢'; break;
case '秋天': echo '豐收果實'; break;
case '冬天': echo '白雪皚皚'; break;
default: echo '無資料';
}
// 刪除單一變數 unset($_SESSION['season']); // 徹底銷毀整個會話 session_destroy(); // 重置 $_SESSION 陣列,刪除伺服器端存儲 // 同時刪除客戶端 Session Cookie setcookie(session_name(), '', time()-3600, '/');
; php.ini session.cookie_httponly = 1 ; 防 XSS 竊取 session.cookie_secure = 1 ; 僅 HTTPS 傳輸(需 HTTPS 站點) session.use_strict_mode = 1 ; 拒絕未初始化的 Session ID session.gc_maxlifetime = 1440 ; 24 分鐘廢棄回收 session.save_handler = redis ; 分散式環境共享 session.save_path = "tcp://127.0.0.1:6379"
session_write_close() 提前釋放鎖session_regenerate_id(true) 重新產生 ID