HTTP 是無狀態協議,每次請求互不相關。為了識別用戶狀態(如登入狀態、購物車),引入了 Client 端 Cookie 與 Server 端 Session 兩大機制。
<?php
// 設定 Cookie(必須在輸出前)
setcookie('username', 'Lee', time() + 7*24*3600, '/', '', false, true); // 最後兩參數:secure, httponly
// 讀取
if (isset($_COOKIE['username'])) {
echo '歡迎,' . htmlspecialchars($_COOKIE['username']);
}
// 刪除(設定過期時間為過去)
setcookie('username', '', time() - 3600, '/');
?>
setcookie('name', 'val', ..., '.example.com')session_start() 啟動/恢復會話(必須在輸出前)$_SESSION 超全域陣列PHPSESSID) 或 URL 傳遞<?php
session_start();
// 寫入
$_SESSION['user'] = ['id' => 1, 'name' => 'Lee'];
// 讀取
if (isset($_SESSION['user'])) {
echo '登入用戶:' . $_SESSION['user']['name'];
}
// 刪除單一鍵
unset($_SESSION['user']);
// 銷毀整個 Session
session_destroy(); // 同時需刪除 Cookie:setcookie(session_name(), '', time()-3600);
?>
| 指令 | 建議值 | 說明 |
|---|---|---|
| session.gc_maxlifetime | 1440 | 垃圾回收最大壽命(秒) |
| session.cookie_httponly | 1 | 防 JS 竊取 Session ID |
| session.cookie_secure | 1 (HTTPS) | 僅 HTTPS 傳輸 Cookie |
| session.use_strict_mode | 1 | 拒絕未初始化的 Session ID |
| session.save_handler | files / redis | 分散式部署建議 Redis |
session_regenerate_id(true) 防 Session Fixationsession.cookie_samesite = 'Lax' 或 'Strict' 緩解 CSRFCookie 適合「記住我」、追蹤偏好等非敏感長期資料;Session 適合登入狀態、權限、購物車等敏感短期資料。實務上常雙劍合璧:Session 存核心狀態,Cookie 存加密 Token 實現自動登入。