PHP Session 与 Cookie
Session 和 Cookie 是 Web 开发中实现用户状态保持的两种核心机制。
Cookie
Cookie 存储在客户端浏览器,适合保存非敏感的偏好设置。
// 设置 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(); ?>
``php <?php session_start();Cookie vs Session 对比
特性 Cookie Session 存储位置 客户端浏览器 服务器 安全性 低(可被篡改) 高 容量 ~4KB 无限制 生命周期 可自定义 浏览器关闭或超时 适用场景 记住我、偏好设置 登录状态、购物车 闪存消息(Flash Message)
// 设置一次性消息 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'); // 空字符串