«

PHP Session 与 Cookie:会话管理实战指南

时间:2026-10-4 10:21     作者:emer     分类: 无


前言

HTTP 是无状态的,你每次请求服务器都不认识你。Session 和 Cookie 就是用来解决这个问题的。本文讲清楚 PHP 中 Session 和 Cookie 的用法。

一、Cookie 是什么

Cookie 是存在浏览器里的小数据,每次请求自动带给服务器。

设置 Cookie

setcookie("username", "张三", time() + 3600, "/");

参数说明:

读取 Cookie

echo $_COOKIE['username'];

删除 Cookie

setcookie("username", "", time() - 3600, "/");

把过期时间设成过去就行。

二、Session 是什么

Session 是存在服务器上的数据,通过 Session ID 识别用户。

启动 Session

session_start();

注意:必须在输出之前调用,不然会报错。

存数据

$_SESSION['user_id'] = 1;
$_SESSION['username'] = '张三';

读数据

echo $_SESSION['username'];

删除单个数据

unset($_SESSION['user_id']);

销毁 Session

session_destroy();

三、Session 和 Cookie 的区别

对比 Cookie Session
存储位置 浏览器 服务器
大小限制 4KB 无限制
安全性 低(用户能改) 高
生命周期 可设置 默认浏览器关闭就没

四、登录功能示例

登录页

<?php
session_start();

if ($_POST) {
    $username = $_POST['username'];
    $password = $_POST['password'];

    // 验证用户名密码
    if ($username == 'admin' && $password == '123456') {
        $_SESSION['user_id'] = 1;
        $_SESSION['username'] = $username;
        header('Location: dashboard.php');
        exit;
    } else {
        echo "用户名或密码错误";
    }
}
?>

判断是否登录

<?php
session_start();

if (!isset($_SESSION['user_id'])) {
    header('Location: login.php');
    exit;
}
?>

退出登录

<?php
session_start();
session_destroy();
header('Location: login.php');
exit;
?>

五、Session 配置

修改 Session 有效期

ini_set('session.gc_maxlifetime', 3600); // 1小时
session_start();

修改 Session 存储路径

session_save_path('/tmp/sessions');
session_start();

用 Redis 存储 Session

生产环境推荐用 Redis 存 Session,默认文件存储性能差。

php.ini 配置:

session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"

六、安全问题

1. Session 劫持

别人拿到你的 Session ID,就能冒充你。

防护:

2. Cookie 劫持

别人拿到你的 Cookie,就能冒充你。

防护:

setcookie("token", $token, [
    'expires' => time() + 3600,
    'path' => '/',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Strict'
]);

3. CSRF 攻击

别人伪造你的请求。

防护:

七、常见坑

  1. session_start() 在输出之后:报错 headers already sent
  2. Session 没销毁:退出登录后还能访问
  3. Cookie 大小限制:别存太多东西,超过 4KB 就丢
  4. Session 文件太多:默认文件存储,大了要清理

八、最佳实践

  1. 敏感数据用 Session,别存 Cookie
  2. Cookie 加 HttpOnly 和 Secure
  3. 生产环境用 Redis 存 Session
  4. 登录成功后重新生成 Session ID,防止固定攻击
// 登录成功后
session_regenerate_id(true);

总结

Session 和 Cookie 的核心要点:

  1. Cookie 存在浏览器,Session 存在服务器
  2. session_start() 必须在输出之前调用
  3. Session 更安全,Cookie 更轻量
  4. 生产环境用 Redis 存 Session
  5. Cookie 加 HttpOnly 和 Secure,防劫持

登录、权限、购物车,都离不开 Session 和 Cookie。搞懂这俩,PHP 后端才算入门。

标签: PHP Session Cookie 会话管理 登录