Session 是 PHP 實現用戶狀態追蹤的核心機制,本文詳細說明 Session 的啟動、變數註冊、銷毀流程、php.ini 關鍵設定、垃圾回收機制,以及 Cookie 被禁用時的替代傳遞方案。
<?php
session_start(); // 必須在任何輸出之前呼叫
?>
注意:session_start() 之前不能有任何輸出(含空白字元、BOM 標記),否則會觸發 "headers already sent" 錯誤。
<?php
session_start();
$_SESSION['username'] = 'skygao';
$_SESSION['uid'] = 1;
// 讀取
echo $_SESSION['username']; // skygao
?>
Session 資料儲存在伺服器端檔案中,路徑由 session.save_path 指定。
<?php
session_start();
// 刪除單一變數
unset($_SESSION['username']);
// 刪除所有 Session 變數(保留 $_SESSION 陣列結構)
$_SESSION = array();
// 完整銷毀 Session(含伺服器端檔案)
session_destroy();
// 若使用 Cookie 傳遞 Session ID,須同時刪除客戶端 Cookie
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time() - 3600, '/');
}
?>
<?php
session_start();
$_SESSION = array(); // 1. 清空所有變數
if (isset($_COOKIE[session_name()])) { // 2. 刪除 Session ID Cookie
setcookie(session_name(), '', time() - 42000, '/');
}
session_destroy(); // 3. 銷毀伺服器端 Session 檔案
?>
| 設定項 | 預設值 | 說明 |
|---|---|---|
| session.auto_start | 0 | 自動啟動 Session,啟用後無法在 Session 中存放物件 |
| session.cookie_lifetime | 0 | Cookie 存活秒數,0 表示瀏覽器關閉即失效 |
| session.gc_maxlifetime | 1440 | Session 檔案最大存活秒數(24 分鐘),超過視為垃圾 |
| session.gc_probability / gc_divisor | 1 / 100 | 垃圾回收啟動機率 = probability/divisor,建議 1/1000~5000 |
| session.save_path | /tmp | Session 檔案儲存路徑,需確保目錄存在且可寫 |
| session.use_cookies | 1 | 是否使用 Cookie 傳遞 Session ID |
PHP 的 Session GC 並非即時執行,而是在 session_start() 時按機率觸發:
session.save_path 下的所有 Session 檔案。gc_maxlifetime 秒則刪除。gc_probability / gc_divisor 決定,避免高併發時效能衝擊。當客戶端禁用 Cookie,Session ID 無法透過 Cookie 傳遞,有兩種替代方式:
<?php
session_start();
echo '<a href="demo.php?' . session_name() . '=' . session_id() . '">連結</a>';
?>
session.use_trans_sid)<?php
session_start();
echo '<a href="demo.php?' . SID . '">連結</a>'; // SID 若為空字串表示 Cookie 正常
?>
Linux + PHP 編譯時加入 --enable-trans-sid 且 session.use_trans_sid=1 時,相對 URL 會自動附加 Session ID;Windows 環境不支援自動重寫,需手動處理。
session.save_path 目錄權限、磁碟空間、gc_maxlifetime 是否過短。session.cookie_domain = .example.com。session.cookie_httponly=1、session.cookie_secure=1 (HTTPS)、定期重新產生 ID session_regenerate_id(true)。掌握 Session 完整生命週期與設定細節,能構建更穩健、安全的用戶認證與狀態管理系統。