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 是必须掌握的。


emer 发布于  2026-10-8 07:13 

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 
'); })();