PHP 会话管理详解
时间:2026-10-6 07:41 作者:emer 分类: 无
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 工作原理
- 用户第一次访问,PHP 生成唯一 session_id
- 把 session_id 通过 Cookie 发给浏览器
- 浏览器下次访问自动带上这个 Cookie
- 服务器根据 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 防攻击
搞懂这些,用户登录功能就不会出问题了。