PHP 会话管理详解

PHP 会话管理详解

Session 和 Cookie 是 PHP 做用户登录、状态保持的基础,搞懂原理才不会出问题。

1. Cookie 和 Session 的区别

Cookie:存在客户端浏览器里,每次请求自动带在请求头里。

  • 大小限制 4KB
  • 不安全,用户可以改
  • 适合存不敏感的数据

Session:存在服务器端,客户端只存一个 session_id。

  • 大小没有限制
  • 更安全
  • 适合存用户登录信息

2. Cookie 基本用法

// 设置 Cookie(7天过期)
setcookie('user_id', '123', time() + 3600 * 24 * 7);

// 读取 Cookie
echo $_COOKIE['user_id'];

// 删除 Cookie(过期时间设为过去)
setcookie('user_id', '', time() - 3600);

3. Session 基本用法

// 开启 Session(必须在最前面)
session_start();

// 设置 Session
$_SESSION['user_id'] = 123;
$_SESSION['user_name'] = '张三';

// 读取 Session
echo $_SESSION['user_name'];

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

// 销毁所有 Session
session_destroy();

4. Session 工作原理

  1. 用户第一次访问,PHP 生成唯一 session_id
  2. 把 session_id 通过 Cookie 发给浏览器
  3. 浏览器下次访问自动带上这个 Cookie
  4. 服务器根据 session_id 找到对应 Session 数据

5. Session 配置

php.ini 里常用配置:

; Session 保存路径
session.save_path = "/tmp"

; Session 过期时间(分钟)
session.gc_maxlifetime = 1440

; Cookie 有效期(0 表示浏览器关闭就过期)
session.cookie_lifetime = 0

6. 常见问题

1)Session 丢失:

  • 没有 session_start()
  • Cookie 被禁用
  • session 文件目录权限不对

2)多台服务器 Session 共享:

  • 默认 Session 存在本地文件,多台服务器不共享
  • 解决方案:存在 Redis 里
// Session 存 Redis
ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://127.0.0.1:6379');

7. 安全建议

  • 登录成功后重新生成 session_id,防止会话固定攻击
  • 敏感数据不要存在 Cookie 里
  • Session 过期时间不要太长
  • HTTPS 下设置 Cookie 的 secure 属性
// 登录成功后重新生成 ID
session_regenerate_id(true);

总结

PHP 会话管理核心:

  • Cookie 存客户端,Session 存服务器
  • Session 靠 Cookie 里的 session_id 识别用户
  • 多服务器部署 Session 存 Redis
  • 登录后重新生成 session_id 防攻击

搞懂这些,用户登录功能就不会出问题了。


emer 发布于  2026-10-6 07:41