Session 機制的核心是 Session ID——一個隨機生成的唯一字串,對應伺服器硬盤上的 sess_ 文件。ID 的傳遞方式決定了生命週期的長短:
setcookie(session_name(), session_id(), time()+$lifeTime, '/')session.use_trans_sid=1 自動附加 ?PHPSESSID=xxx<?php
session_start();
// 保存 1 天
$lifeTime = 24 * 3600;
setcookie(session_name(), session_id(), time() + $lifeTime, '/');
?>
優點:直觀可控,可自定義 Cookie 域、路徑、Secure/HttpOnly 等屬性。
<?php
// 必須在 session_start() 之前調用!
$lifeTime = 24 * 3600;
session_set_cookie_params($lifeTime, '/', '.example.com', true, true); // 完整參數
session_start();
?>
參數詳解:lifetime, path, domain, secure, httponly。關鍵限制:必須在 session_start() 前調用,否則無效。
即使客戶端 Cookie 設為 30 天,伺服器端 session.gc_maxlifetime(默認 1440 秒 = 24 分鐘)到期後,Session 文件仍會被 GC 隨機刪除。雙重保險必須同步配置:
; php.ini 或 .user.ini
session.gc_maxlifetime = 86400 ; 24 小時
session.gc_probability = 1
session.gc_divisor = 1000 ; 0.1% 概率觸發 GC,降低性能抖動
或運行時設置:
ini_set('session.gc_maxlifetime', 86400);
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 1000);
session.save_handler = redis,session.save_path = "tcp://127.0.0.1:6379"SessionHandlerInterface 寫入 MySQL/PostgreSQLsession.save_path = /mnt/shared/sessions(性能較差,不推薦)session.cookie_httponly = 1 防 XSS 竊取session.cookie_secure = 1 僅 HTTPS 傳輸session.use_strict_mode = 1 拒絕未初始化的 IDsession.sid_length = 32 session.sid_bits_per_character = 5 增加熵值session_regenerate_id(true) 防固定攻擊Session 生命週期 = 客戶端 Cookie 存活時間 ∩ 服務端 GC 最大壽命 ∩ 存儲後端 TTL。三者取最小值。生產環境請務必:統一配置三端參數、遷移至 Redis、啟用安全屬性、監控 GC 頻率。這才是「寫一次配置,終身無憂」的專業姿勢。