PHP Session 由 session.auto_start 控制是否自動啟動(預設 0,手動呼叫 session_start())。客戶端識別 ID 透過 Cookie(session.use_cookies=1)或 URL 參數傳遞,建議啟用 session.use_only_cookies=1 防止 Session Fixation 攻擊。
| 設定項 | 預設 | 建議 |
|---|---|---|
| session.name | PHPSESSID | 自定義專屬名稱,避免多系統衝突 |
| session.cookie_lifetime | 0(瀏覽器關閉失效) | 按業務設定秒數,如 86400(1 天) |
| session.cookie_path | / | 縮小至實際應用路徑 |
| session.cookie_domain | 空(當前域) | 跨子域共享時設定 .example.com |
| session.cookie_httponly | 空 | 必開 1,防 JS 竊取 Session ID |
| session.cookie_secure | 空 | 僅 HTTPS 站點開 1 |
session.save_handler = files
session.save_path = "/tmp" ; 單層目錄
; 或分層: "2;/var/lib/php/session" ; 2 級子目錄,緩解 inode 壓力
; 權限模式: "2;600;/var/lib/php/session"
session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211?persistent=0&weight=1&timeout=1&retry_interval=15,
tcp://127.0.0.1:11212?persistent=0&weight=1&timeout=1&retry_interval=15"
較新擴展,API 更豐富,支援一致性雜湊、SASL 認證,配置語法類似。
session_set_save_handler()實現 open, close, read, write, destroy, gc 六介面,可接入 Redis、資料庫、MongoDB 等任意後端。注意:若同時啟用檔案鎖與自定義寫入,可能導致資料競爭丟失。
session.gc_maxlifetime 即 Cookie 存活時間 → 實為 GC 機率觸發閾值,Cookie 由 cookie_lifetime 決定session_regenerate_id(true) 登入後重新生成 ID,防 Session FixationSession 存儲無銀彈。單機小流量用 files,分布式高併發首選 Redis/Memcached,合規場景落地資料庫。核心在於根據業務一致性、效能、運維成本三角權衡選型,並建立完善監控與降級預案。