PHP 会话管理详解
PHP 会话管理详解
Session 是 PHP 做用户登录状态管理的核心功能,搞懂它很重要。
1. 什么是 Session
- Cookie: 存在客户端(浏览器)
- Session: 存在服务器端
- 通过 SessionID 关联用户
2. 基础用法
// 开启会话(必须放在最前面)
session_start();
// 存数据
$_SESSION['user_id'] = 1;
$_SESSION['username'] = "test";
// 取数据
echo $_SESSION['username'];
// 判断是否登录
if (isset($_SESSION['user_id'])) {
echo "已登录";
} else {
echo "未登录";
}
// 销毁会话
session_destroy();
3. 登录验证示例
// 登录页
session_start();
if ($_POST['password'] == "123456") {
$_SESSION['user'] = $_POST['username'];
header("Location: dashboard.php");
}
// 验证页
session_start();
if (!isset($_SESSION['user'])) {
header("Location: login.php");
exit;
}
4. 常用配置
php.ini 里的配置:
; 会话有效期(分钟)
session.gc_maxlifetime = 1440
; Cookie 有效期(秒)
session.cookie_lifetime = 0
; 是否只允许 HTTP 访问 Cookie
session.cookie_httponly = On
5. 常见问题
1)session 丢失:
- 检查是否有输出(session_start 前不能有空格)
- 检查 Cookie 是否被禁用
2)多服务器共享 Session:
- 存在数据库里
- 存在 Redis 里
- 不要用文件 Session
3)安全问题:
- 登录后重新生成 SessionID
session_regenerate_id(); - 防止 Session 固定攻击
6. Cookie vs Session
| 对比 | Cookie | Session |
|---|---|---|
| 存储位置 | 客户端 | 服务器端 |
| 大小限制 | 4KB | 无限制 |
| 安全性 | 低 | 高 |
| 生命周期 | 可长期保存 | 浏览器关闭就没了 |
7. 登出销毁
session_start();
// 清除所有 session 变量
$_SESSION = array();
// 清除 session cookie
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time()-42000, '/');
}
// 销毁 session
session_destroy();
总结
PHP 会话管理要点:
- session_start() 必须在最前面
- 登录验证用 $_SESSION 判断
- 生产环境用 Redis 存 Session
- 登录后重新生成 SessionID 防攻击
做用户系统,Session 是必须掌握的。
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 工作原理
- 用户第一次访问,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 防攻击
搞懂这些,用户登录功能就不会出问题了。