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

PHP Session 完整指南:啟動、儲存、銷毀與最佳實踐

     編輯:PHP 入門

PHP Session 完整指南

HTTP 協定本質上是無狀態的,Session 機制透過在伺服器端儲存使用者資料,並以唯一識別碼(Session ID)關聯客戶端,解決了跨請求的狀態保持問題。本文系統整理 Session 核心操作與實務應用。

Session 工作原理

  1. 用戶首次訪問,伺服器建立 Session,生成唯一 Session ID
  2. Session ID 透過 Cookie(預設名為 PHPSESSID)或 URL 參數傳遞給客戶端
  3. 後續請求攜帶 Session ID,伺服器識別用戶並載入對應資料
  4. 資料儲存於伺服器端(檔案、資料庫、Redis 等),客戶端僅持有 ID

啟動 Session

關鍵規則: session_start() 必須在任何輸出(HTML、空白、BOM)之前呼叫。

<?php
// 必須在最頂端,甚至在 <html> 之前
session_start();
?>
<!DOCTYPE html>
<html>
<head><title>Session Demo</title></head>
<body>...</body>
</html>

儲存與讀取 Session 資料

使用超全域陣列 $_SESSION:

<?php
session_start();

// 寫入
$_SESSION['username'] = 'john_doe';
$_SESSION['login_time'] = time();
$_SESSION['permissions'] = ['read', 'write'];

// 讀取
if (isset($_SESSION['username'])) {
    echo "歡迎回來,{$_SESSION['username']}";
    echo "登入時間:" . date('Y-m-d H:i:s', $_SESSION['login_time']);
}
?>

實用範例:頁面瀏覽計數器

<?php
session_start();

if (isset($_SESSION['views'])) {
    $_SESSION['views']++;
} else {
    $_SESSION['views'] = 1;
}

echo "您是第 {$_SESSION['views']} 次瀏覽本頁面。";
?>

刪除與銷毀 Session

刪除特定變數

<?php
session_start();
unset($_SESSION['temp_data']); // 釋放單一變數
?>

完全銷毀 Session(登出)

<?php
session_start();

// 1. 刪除所有 session 變數
$_SESSION = array();

// 2. 刪除 session cookie(若使用 cookie 傳遞 ID)
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

// 3. 銷毀伺服器端 session 資料
session_destroy();

header("Location: login.php");
exit;
?>

Session 進階設定

自訂儲存處理器(資料庫/Redis)

<?php
class DatabaseSessionHandler implements SessionHandlerInterface {
    private $pdo;
    
    public function __construct(PDO $pdo) {
        $this->pdo = $pdo;
    }
    
    public function open($savePath, $sessionName) { return true; }
    public function close() { return true; }
    
    public function read($id) {
        $stmt = $this->pdo->prepare("SELECT data FROM sessions WHERE id = ?");
        $stmt->execute([$id]);
        return $stmt->fetchColumn() ?: '';
    }
    
    public function write($id, $data) {
        $stmt = $this->pdo->prepare("REPLACE INTO sessions (id, data, expiry) VALUES (?, ?, ?)");
        return $stmt->execute([$id, $data, time() + ini_get('session.gc_maxlifetime')]);
    }
    
    public function destroy($id) {
        $stmt = $this->pdo->prepare("DELETE FROM sessions WHERE id = ?");
        return $stmt->execute([$id]);
    }
    
    public function gc($maxlifetime) {
        $stmt = $this->pdo->prepare("DELETE FROM sessions WHERE expiry < ?");
        return $stmt->execute([time()]);
    }
}

$handler = new DatabaseSessionHandler($pdo);
session_set_save_handler($handler, true);
session_start();
?>

重要 php.ini 設定

設定項建議值說明
session.gc_maxlifetime1440 (24分鐘)資料最大存活秒數,超過視為垃圾回收
session.cookie_lifetime00 表示瀏覽器關閉即過期(會話級 Cookie)
session.cookie_httponly1防止 JavaScript 存取 Cookie,緩解 XSS
session.cookie_secure1 (HTTPS 環境)僅透過 HTTPS 傳輸 Cookie
session.use_strict_mode1拒絕未初始化的 Session ID,防止固定攻擊
session.sid_length32Session ID 長度,越長越安全

安全最佳實踐

  • HTTPS 全站強制:確保 Session ID 傳輸加密
  • 定期重新生成 ID:權限變更(登入、提權)時呼叫 session_regenerate_id(true)
  • 敏感操作驗證:修改密碼、綁定郵箱等操作要求重新驗證密碼
  • 避免儲存敏感資料:密碼、信用卡號等不可存入 Session
  • 設定合理過期時間:平衡安全性與使用者體驗

常見問題排查

Session 變數跨頁面遺失
檢查:session_start() 是否在所有頁面頂端調用;Cookie 是否被瀏覽器阻擋;session.save_path 目錄是否可寫
並發請求阻塞
預設檔案儲存會鎖定 Session 檔案。長時間運行腳本應呼叫 session_write_close() 釋放鎖
分散式環境 Session 不共享
使用資料庫、Redis、Memcached 等集中式儲存替代預設檔案系統

Session 是 PHP 狀態管理的核心,理解其運作機制並遵循安全實踐,能構建既便利又安全的使用者體驗。

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