Session 是 PHP 狀態管理的核心機制,但「headers already sent」、「存儲路徑錯誤」、「變量丟失」等問題屢見不鮮。本文匯總 10 個高頻 Session 錯誤場景,提供根因分析與可落地的修復方案。
Warning: Cannot send session cookie - headers already sent
Warning: Cannot send session cache limiter - headers already sent
原因:session_start() 前已有輸出(包括空白字符、BOM、echo/print)。
修復:將 session_start() 置於腳本最頂端;檢查文件編碼為 UTF-8 無 BOM;關閉輸出緩衝或使用 ob_start()。
Warning: open(F:/689\php\sessiondata\sess_..., O_RDWR) failed
原因:php.ini 中 session.save_path 未配置或目錄不可寫。
修復:設置 session.save_path = "C:/temp" 並確保目錄存在且可寫;或運行時調用 session_save_path()。
Warning: Trying to destroy uninitialized session
原因:直接調用 session_destroy() 而未先 session_start()。
修復:銷毀前必須啟動:session_start(); session_destroy();。
echo SID; // 常量 SID 包含 "PHPSESSID=xxx" 或空串
現象:代碼邏輯無輸出,但 include 文件末尾 ?> 後存在空行/空格。
修復:刪除 PHP 結束標籤後的所有空白字符,或直接省略 ?>(現代框架通用做法)。
session_start();
if (!isset($_SESSION['login']) || $_SESSION['login'] !== true) {
exit('未登錄');
}
現象:session_register('ok'); header('Location: next.php'); 導致下一頁讀不到 $ok。
根因:舊版 PHP 在重定向前未將 Session 數據寫入存儲。
修復:攜帶 SID 參數跳轉:header("Location: next.php?" . SID); 或升級 PHP 版本並啟用 session.write_short_circuit。
session_start();
$_SESSION['data'] = array(1,2,3,4); // 直接賦值,無需 session_register(已棄用)
echo $_SESSION['username'];
echo $HTTP_SESSION_VARS['username']; // PHP 4.1+ 棄用,僅兼容舊代碼
| 函數 | 作用 | 注意事項 |
|---|---|---|
| session_unregister('var') | 註銷單個 Session 變量 | 需配合 unset($_SESSION['var']) 徹底清除 |
| session_destroy() | 銷毀整個 Session 環境 | 不清除 $_SESSION 超全局數組,建議銷毀前避免訪問 $_SESSION |
// 完整銷毀範例
if (isset($_COOKIE[session_name()])) {
session_start();
session_destroy();
unset($_COOKIE[session_name()]);
}
Session 問題 90% 歸因於「輸出順序錯誤」「配置缺失」「舊式 API 誤用」。現代開發建議:
$_SESSION 超全局數組,棄用 session_register 等舊函數。