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

PHP Session 完整操作指南:啟動、註冊、銷毀、編碼解碼、ID 再生成實戰範例

     編輯:PHP 相關知識

前言

Session 是 PHP 維持用戶狀態的核心機制。本文系統整理 session_start、session_register、session_unregister、session_is_registered、session_destroy、session_encode/session_decode、session_regenerate_id 等函式,並提供 5 個完整實戰範例,涵蓋初始化、變數管理、安全銷毀、編碼儲存、ID 重生成等常見場景。

核心函式速查

函式用途備註
session_start()啟動或恢復 Session必須在輸出前呼叫
session_register($name)註冊全域變數到 Session(已棄用)PHP 5.4+ 移除,改用 $_SESSION
session_unregister($name)取消註冊(已棄用)改用 unset($_SESSION[$name])
session_is_registered($name)檢查是否已註冊(已棄用)改用 isset($_SESSION[$name])
session_destroy()銷毀所有 Session 資料不刪除 $_SESSION 陣列本身
session_encode()將 Session 資料序列化為字串格式:name|value;...
session_decode($data)解析 session_encode 字串並填入 $_SESSION需先 session_start()
session_regenerate_id($delete_old=false)產生新 Session ID,可選刪除舊檔案防止 Session Fixation 攻擊

範例 1:完整的 Session 初始化與銷毀流程

session_start();
// 清空所有 Session 變數
$_SESSION = array();

// 刪除 Session Cookie
if (isset($_COOKIE[session_name()])) {
    setcookie(session_name(), '', time() - 42000, '/');
}

// 徹底銷毀 Session
session_destroy();

關鍵點:銷毀需三步驟:清空 $_SESSION、刪除 Cookie、呼叫 session_destroy()。

範例 2:舊式註冊與解碼(僅供舊專案參考)

session_start();
$a = 5;
session_register('a');           // 註冊 $a 到 $_SESSION
session_decode("some|serialized|data"); // 解析字串填入 $_SESSION
print(session_is_registered('a') ? $_SESSION['a'] : 'not registered');

警告:session_register 等函式已移除,現代專案請直接操作 $_SESSION 超全域陣列。

範例 3:Session 編碼與銷毀

session_start();
$_SESSION['login_ok'] = true;
$_SESSION['nome']   = 'sica';
$_SESSION['inteiro'] = 34;

$result = session_encode(); // 序列化
echo $result;               // 輸出:login_ok|b:1;nome|s:4:"sica";inteiro|i:34;

session_destroy();          // 銷毀

範例 4:Session ID 再生成防止固定攻擊

session_start();
$_SESSION['name'] = "yoursession";

if (!isset($_SESSION['initiated'])) {
    session_regenerate_id(true); // 產生新 ID 並刪除舊 Session 檔案
    $_SESSION['initiated'] = true;
}

session_destroy();

最佳實踐:用戶登入成功、權限變更時呼叫 session_regenerate_id(true),防止 Session Fixation。

範例 5:檢查變數是否存在於 Session

session_start();
$_SESSION['name'] = "yoursession";

if (isset($_SESSION['name'])) { // 現代寫法
    echo "指定的變數已經被註冊為 session<br>";
} else {
    echo "指定的變數沒有被註冊為 session<br>";
}
session_destroy();

現代 Session 管理最佳實踐

  • 直接使用 $_SESSION:不再使用 session_register 等舊函式。
  • 安全設定:php.ini 設定 session.cookie_httponly=1、session.cookie_secure=1(HTTPS)、session.use_strict_mode=1。
  • 自訂儲存處理器:實作 SessionHandlerInterface 將 Session 存入 Redis、Memcached、資料庫,支援分散式部署。
  • 閒置超時:設定 session.gc_maxlifetime 並配合 session_set_cookie_params 控制 Cookie 存活期。
  • CSRF 防護:在 Session 中儲存 Token,表單驗證時比對。

常見問題排查

  • Session 無法啟動:檢查 session_start() 前是否有輸出(含 BOM、空白字元),或 session.save_path 目錄權限。
  • 跨子域共享:設定 session.cookie_domain = ".example.com"。
  • Session 資料遺失:檢查 session.gc_probability/gc_divisor 垃圾回收機率、多伺服器環境是否共享儲存。

總結

Session 是 PHP 狀態管理的基石。雖然舊式 session_register 等函式已棄用,但理解其演進歷程有助於維護舊專案。現代開發應完全轉向 $_SESSION 超全域陣列,並配合安全設定、自訂儲存處理器、ID 再生成等最佳實踐,構建健壯的用戶狀態管理系統。

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