Session 從使用者造訪頁面開始,到斷開連線為止,形成一個會話生命週期。伺服器分配唯一 SessionID 識別使用者,並將會話資料儲存在伺服端(檔案、資料庫、快取等),客戶端僅保留 ID(通常透過 Cookie PHPSESSID 或 URL 參數傳遞)。
session_start() 檢查 Cookie 中是否有 PHPSESSID,無則產生新 ID 並發送 Cookie;有則讀取對應儲存檔案並反序列化到 $_SESSION。$_SESSION 陣列,結束時自動序列化寫回儲存介質。session_destroy() 刪除伺服端檔案與 $_SESSION,搭配 setcookie(..., time()-3600) 刪除客戶端 Cookie。session.name = PHPSESSID:Cookie 名稱。session.save_handler = files:儲存引擎(files/user/memcache/sqlite...)。session.save_path = /tmp:檔案儲存路徑(支援 N;/path 多級目錄)。session.use_cookies = 1:是否用 Cookie 傳 ID。session.gc_maxlifetime = 1440:GC 最大生存秒數(預設 24 分鐘)。session.gc_probability / gc_divisor:GC 啟動機率。單目錄檔案超過 1 萬個時定位極慢。啟用 session.save_path = "2;/path/to/session/dir" 兩級子目錄(各 16 進制 0-f),需預先建立目錄樹。
建議改用 ReiserFS(現已少見)或改用記憶體/資料庫儲存。
php -i | grep "Registered save handlers" 可見支援:files, user, sqlite, eaccelerator, memcache, mmcache, MySQL, PostgreSQL 等。
系統 A(Web)獨立運作,系統 B(Mobile)需呼叫 A 的 API 並保持登入態。
session_id 給 B。session_id。session_start() 前呼叫 session_id($received_id) 接管會話。此法無需修改 A 的驗證邏輯,安全且簡潔。
session_start(); // 必須在輸出前呼叫
$_SESSION['key'] = 'value'; // 寫入
$val = $_SESSION['key']; // 讀取
unset($_SESSION['key']); // 刪除單一鍵
session_destroy(); // 徹底銷毀
session_start()?它告知伺服器:「準備好 Cookie 與儲存檔案」(寫入時),或「根據 ID 載入資料」(讀取時)。只有 session_name() 可在其前呼叫(讀取/設定 Cookie 名稱)。