首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP Session 完整操作指南:從啟動到銷毀與進階設定

     編輯:PHP 相關知識

Session 是 PHP 實現用戶狀態追蹤的核心機制,本文詳細說明 Session 的啟動、變數註冊、銷毀流程、php.ini 關鍵設定、垃圾回收機制,以及 Cookie 被禁用時的替代傳遞方案。

基本操作流程

1. 啟動 Session

<?php
session_start(); // 必須在任何輸出之前呼叫
?>

注意:session_start() 之前不能有任何輸出(含空白字元、BOM 標記),否則會觸發 "headers already sent" 錯誤。

2. 註冊與讀取變數

<?php
session_start();
$_SESSION['username'] = 'skygao';
$_SESSION['uid'] = 1;

// 讀取
echo $_SESSION['username']; // skygao
?>

Session 資料儲存在伺服器端檔案中,路徑由 session.save_path 指定。

3. 刪除單一變數 vs 完全銷毀

<?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 檔案
?>

php.ini 關鍵設定解析

設定項預設值說明
session.auto_start0自動啟動 Session,啟用後無法在 Session 中存放物件
session.cookie_lifetime0Cookie 存活秒數,0 表示瀏覽器關閉即失效
session.gc_maxlifetime1440Session 檔案最大存活秒數(24 分鐘),超過視為垃圾
session.gc_probability / gc_divisor1 / 100垃圾回收啟動機率 = probability/divisor,建議 1/1000~5000
session.save_path/tmpSession 檔案儲存路徑,需確保目錄存在且可寫
session.use_cookies1是否使用 Cookie 傳遞 Session ID

垃圾回收機制 (GC)

PHP 的 Session GC 並非即時執行,而是在 session_start() 時按機率觸發:

  • 掃描 session.save_path 下的所有 Session 檔案。
  • 檢查檔案最後修改時間,若距今超過 gc_maxlifetime 秒則刪除。
  • 機率由 gc_probability / gc_divisor 決定,避免高併發時效能衝擊。

Cookie 被禁用時的替代方案

當客戶端禁用 Cookie,Session ID 無法透過 Cookie 傳遞,有兩種替代方式:

1. 手動在 URL 附加 Session ID

<?php
session_start();
echo '<a href="demo.php?' . session_name() . '=' . session_id() . '">連結</a>';
?>

2. 使用常數 SID(需啟用 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 變數消失:檢查 session.save_path 目錄權限、磁碟空間、gc_maxlifetime 是否過短。
  • 跨子域名共享 Session:設定 session.cookie_domain = .example.com。
  • 安全性:生產環境建議啟用 session.cookie_httponly=1、session.cookie_secure=1 (HTTPS)、定期重新產生 ID session_regenerate_id(true)。

掌握 Session 完整生命週期與設定細節,能構建更穩健、安全的用戶認證與狀態管理系統。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved