Session 概念釐清
「會話」指有始有終的一系列動作/訊息。Web 中常見三種語境:
- 瀏覽器視窗開啟到關閉(客戶端會話)
- 用戶為達成某目標的一系列操作(如購物流程:登入→選購→結帳→登出)
- 網絡協議層面:面向連接 + 保持狀態(如 TCP Session、POP3 Session)
HTTP 本質無狀態,Session 填補此缺口:伺服器分配唯一 Session ID(存 Cookie 或 URL 傳遞),以此識別用戶跨頁面狀態。
Session 運作原理
- 客戶端禁用 Cookie 時,PHP 5 (Linux/Unix) 會自動將 Session ID 附加到 URL;Windows 版無此功能。
- 伺服器端儲存 Session 變數(如
$_SESSION['user']),客戶端僅保留 PHPSESSID Cookie。
- 請求時攜帶 Session ID,伺服器載入對應資料,實現跨頁面全域變數效果。
核心函數與用法
session_start():啟動或恢復會話。必須在任何輸出前調用,否則報 headers already sent 錯誤。
session.auto_start = 1 (php.ini):自動啟動,但無法在 Session 中存放物件(類定義需先於會話啟動載入)。
- 請求結束時註冊變數自動序列化;resource、循環引用物件無法序列化存入。
典型應用場景
- 購物車:跨頁面暫存商品。
- 用戶身份驗證:登入後保持狀態。
- 多步驟表單:分步收集資料。
- 頁面間參數傳遞:避免 URL 參數過長或敏感資料暴露。
常見失效原因排查
- Cookie 被禁用且非 Linux/Unix 環境。
session_start() 前有輸出(含 BOM、空白行)。
- Session 儲存路徑不可寫(
session.save_path 權限問題)。
- Session 過期(
session.gc_maxlifetime 設定過短)。