Session 基本流程
session_start():啟動/恢復會話,必須在任何輸出前呼叫
$_SESSION['key'] = $value:寫入資料
$_SESSION['key']:讀取資料
unset($_SESSION['key']):刪除單一變數
session_destroy():銷毀整個 Session(含檔案與 ID)
完整範例:三檔案示範
session.php - 設定 Session
next
session2.php - 讀取與檢測
del session';
} else {
echo "Session has not been setted";
}
?>
deletesession.php - 完整銷毀
Session 核心函數對照表
| 函數 | 用途 | 回傳值 |
| session_start() | 啟動/恢復會話 | true |
| session_id([$id]) | 取得/設定 Session ID | 字串/bool |
| session_name([$name]) | 取得/設定 Session 名稱 (預設 PHPSESSID) | 字串/bool |
| session_destroy() | 銷毀 Session | bool |
| session_unset() | 釋放所有 $_SESSION 變數 (不結束會話) | void |
| session_regenerate_id() | 產生新 Session ID (防固定攻擊) | bool |
| session_encode() | 序列化 Session 資料 | 字串 |
| session_decode($data) | 反序列化 Session 資料 | bool |
| session_set_cookie_params() | 設定 Session Cookie 參數 (需在 start 前) | bool |
php.ini 關鍵設定
session.save_handler = files
session.save_path = "/tmp" # 或 "N;/path" 分級目錄
session.gc_maxlifetime = 1440 # 垃圾回收壽命(秒)
session.gc_probability = 1
session.gc_divisor = 1000 # 機率 = 1/1000
session.cookie_lifetime = 0 # 0 = 瀏覽器關閉過期
session.use_cookies = 1
session.use_only_cookies = 1 # 防止 URL 傳遞 ID
session.use_strict_mode = 1 # 嚴格模式,拒絕未初始化 ID
常見問題
- headers already sent:
session_start() 前有輸出(空白、BOM、echo)
- Session 不跨頁:檢查 Cookie 設定、Domain/Path、HTTPS Secure 標記
- 並發阻塞:預設檔案鎖定,長時間請求會阻塞同 Session 其他請求,可用
session_write_close() 釋放鎖