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

PHP Session 會話管理完整教程:啟動、存取、銷毀與安全配置

     編輯:PHP 綜合知識

Session 工作原理

Session 將用戶數據存儲在伺服器端(文件/Redis/資料庫),僅在客戶端 Cookie 中保存一個 session_id(預設名 PHPSESSID)。請求時瀏覽器自動攜帶該 ID,PHP 自動載入對應數據到 $_SESSION 超全局陣列。

1. 啟動會話(每請求必須最先調用)

<?php
// 必須在任何輸出前調用
session_start();

// 可選:自定義存儲處理器(Redis、DB 等)
// ini_set('session.save_handler', 'redis');
// ini_set('session.save_path', 'tcp://127.0.0.1:6379');
?>

2. 存儲數據(支援任意可序列化類型)

<?php
$_SESSION['login_user'] = 'zs';                    // 字符串
$_SESSION['user_id'] = 1001;                       // 整數
$_SESSION['is_admin'] = true;                      // 布爾
$_SESSION['permissions'] = ['read', 'write'];      // 陣列
$_SESSION['cart'] = new Cart();                    // 物件(需實現 __sleep/__wakeup 或 Serializable)
?>

3. 讀取與檢查

<?php
// 讀取單值
$user = $_SESSION['login_user'] ?? '游客';

// 判斷是否登入
if (empty($_SESSION['user_id'])) {
    header('Location: /login.php');
    exit;
}

// 遍歷所有會話數據
foreach ($_SESSION as $key => $val) {
    echo "$key => ";
    var_dump($val);
}
?>

4. 刪除指定/全部會話數據

<?php
// 刪除單個鍵
unset($_SESSION['login_user']);

// 刪除全部會話數據(但保留 session_id)
$_SESSION = [];

// 徹底銷毀會話:刪除伺服器存儲 + 客戶端 Cookie
session_destroy(); // 僅刪除伺服器端文件
// 同時刪除客戶端 Cookie
if (ini_get('session.use_cookies')) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params['path'], $params['domain'],
        $params['secure'], $params['httponly']
    );
}
?>

5. 獲取 Session ID 與常量

<?php
$sid = session_id();        // 當前會話 ID
$sid = session_name();      // Cookie 名稱(預設 PHPSESSID)
$sid = SID;                 // 常量:若未啟用 Cookie 則為 "PHPSESSID=abc123",否為空字符串
?>

6. 生產環境安全配置

配置項推薦值說明
session.cookie_httponly1防 XSS 竊取 Session ID
session.cookie_secure1僅 HTTPS 傳輸(生產必開)
session.cookie_samesite'Lax'CSRF 防護
session.use_strict_mode1拒絕未初始化的 ID,防固定攻擊
session.gc_maxlifetime1440 (24h: 86400)伺服器端數據最大存活秒數
session.save_path/var/lib/php/sessions權限 700,屬於 php-fpm 用戶

可在 php.ini 或運行時 ini_set() 設置;session_set_cookie_params() 需在 session_start() 前調用。

7. 分佈式系統:Session 共享方案

  • Redis:session.save_handler=redis,高性能、支援集群、可設 TTL 自動過期。
  • 資料庫:自定義 SessionHandlerInterface 寫入 MySQL/PostgreSQL,便於審計。
  • JWT 無狀態:不再依賴伺服器 Session,將用戶狀態簽名存入 Token,適合微服務、Serverless。

8. 常見問題 FAQ

Session 數據丟失?
檢查 session_start() 是否漏寫;確認 session.save_path 可寫;排查多伺服器未共享存儲;注意 session_write_close() 過早調用。
「Headers already sent」警告?
session_start() 必須在任何 echo、HTML、空白行、BOM 前調用。
並發請求阻塞?
預設文件鎖機制導致同一 Session 串行;長耗時操作前調用 session_write_close() 釋放鎖,或改用 Redis 非阻塞鎖。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved