PHP Session 与 Cookie

Session 和 Cookie 是 Web 开发中实现用户状态保持的两种核心机制。

Cookie 存储在客户端浏览器,适合保存非敏感的偏好设置。

PHP 实例
// 设置 Cookie(必须在任何输出之前调用)
setcookie(
    'username',          // 名称
    '张三',              // 值
    time() + 86400 * 7, // 过期时间(7天后)
    '/',                 // 路径
    '',                  // 域名
    true,                // 仅 HTTPS
    true                 // HttpOnly(JS 无法访问)
);

// 读取 Cookie $username = $_COOKIE['username'] ?? '访客'; echo "你好,$username";

// 删除 Cookie(设置过期时间为过去) setcookie('username', '', time() - 3600, '/'); ?> ``

Session 基础

Session 数据存储在服务器端,客户端只保存一个 Session ID。

`php <?php session_start(); // 必须在页面最顶部调用

// 存储数据 $_SESSION['user_id'] = 1; $_SESSION['username'] = '张三'; $_SESSION['is_admin'] = false;

// 读取数据 echo $_SESSION['username']; // 张三

// 删除单个 unset($_SESSION['is_admin']);

// 销毁整个 Session(退出登录) session_destroy(); ?> `

登录系统完整示例

`php <?php // login.php session_start();

// 已登录则跳转 if (isset($_SESSION['user_id'])) { header('Location: dashboard.php'); exit; }

$error = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') { $username = trim($_POST['username'] ?? ''); $password = $_POST['password'] ?? '';

// 查数据库(示例) $pdo = new PDO('mysql:host=localhost;dbname=myapp;charset=utf8mb4', 'root', 'pass'); $stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?"); $stmt->execute([$username]); $user = $stmt->fetch(PDO::FETCH_ASSOC);

if ($user && password_verify($password, $user['password'])) { // 登录成功:重新生成 Session ID 防止固定攻击 session_regenerate_id(true); $_SESSION['user_id'] = $user['id']; $_SESSION['username'] = $user['username']; header('Location: dashboard.php'); exit; } else { $error = "用户名或密码错误"; } } ?> `

`php <?php // dashboard.php session_start();

// 验证登录状态 if (!isset($_SESSION['user_id'])) { header('Location: login.php'); exit; }

echo "欢迎," . htmlspecialchars($_SESSION['username']); ?> `

`php <?php // logout.php session_start(); session_unset(); session_destroy();

// 清除 Session Cookie setcookie(session_name(), '', time() - 3600, '/');

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

Session 配置优化

`php <?php // 在 session_start() 之前配置 ini_set('session.cookie_httponly', 1); // 防 XSS ini_set('session.cookie_secure', 1); // 仅 HTTPS ini_set('session.use_strict_mode', 1); // 严格模式 ini_set('session.gc_maxlifetime', 3600); // 1小时过期

session_start(); ?> `

特性CookieSession
存储位置客户端浏览器服务器
安全性低(可被篡改)
容量~4KB无限制
生命周期可自定义浏览器关闭或超时
适用场景记住我、偏好设置登录状态、购物车

闪存消息(Flash Message)

``php <?php session_start();

// 设置一次性消息 function flash(string $key, string $message = ''): string { if ($message) { $_SESSION['_flash'][$key] = $message; return ''; } $msg = $_SESSION['_flash'][$key] ?? ''; unset($_SESSION['_flash'][$key]); return $msg; }

// 存入 flash('success', '保存成功!');

// 取出(取完即删) echo flash('success'); // 保存成功! echo flash('success'); // 空字符串