| 特性 | Cookie | Session |
|---|---|---|
| 存儲位置 | 客戶端瀏覽器 | 服務器端文件/內存/資料庫 |
| 安全性 | 可被竄改、攔截 | 客戶端無法直接修改 |
| 容量限制 | 約 4KB | 受服務器配置限制,通常無嚴格上限 |
| 敏感數據 | 不建議存儲 | 適合存儲用戶狀態、權限標識 |
Session 通過 Session ID(默認名 PHPSESSID)關聯客戶端與服務器端數據,ID 存於 Cookie 或 URL 中,數據本體始終在服務器,大幅降低洩露風險。
<?php
session_start(); // 必須在任何輸出前調用
$_SESSION['admin'] = true; // 登入成功後標記
?>
<?php
session_start();
if (isset($_SESSION['admin']) && $_SESSION['admin'] === true) {
echo '您已成功登入';
} else {
die('請先登入');
}
?>
<?php
session_start();
unset($_SESSION['admin']); // 刪除單個變量
session_destroy(); // 徹底銷毀 Session 文件
?>
<?php
$savePath = __DIR__ . '/session_data';
session_save_path($savePath); // 必須在 session_start() 之前
session_start();
?>
確保目錄可讀寫且不可直接 Web 訪問。
<?php
$lifeTime = 24 * 3600; // 1 天
session_set_cookie_params($lifeTime); // 或手動 setcookie(session_name(), session_id(), time()+$lifeTime, '/');
session_start();
?>
<?php
session_id($_GET[session_name()]); // 從 URL 獲取 ID
session_start();
?>
PHP 會自動在 URL 附加 PHPSESSID=...,亦可通過隱藏表單傳遞。
Session 原生支援陣列操作。對象會自動序列化/反序列化,但反序列化時需確保類定義已載入:
<?php
// output.php
ini_set('unserialize_callback_func', function($class) {
include_once "$class.php";
});
session_start();
$person = $_SESSION['person'];
$person->output(); // 正常輸出
?>
session_start()。$_SESSION['admin'] === true(嚴格比較)。session.gc_maxlifetime)。session.cookie_secure = 1、session.cookie_httponly = 1。