Skip to content

10.2 Session 原理与使用

Session 是一种在服务器端存储用户状态的机制,用于跟踪用户会话和存储用户信息。

Session 的原理

  1. 服务器为每个用户创建一个唯一的会话 ID
  2. 服务器将用户数据存储在服务器端
  3. 会话 ID 通常通过 Cookie 发送给客户端
  4. 客户端在后续请求中携带会话 ID
  5. 服务器根据会话 ID 检索用户数据

Session 的特点

  • 存储在服务器端,相对安全
  • 存储容量较大
  • 可以存储复杂数据类型
  • 会话会在一定时间后过期
  • 依赖 Cookie 传递会话 ID

示例代码

启动会话

php
<?php
// 启动会话(必须在所有输出之前调用)
session_start();

// 检查会话是否已启动
if (session_status() === PHP_SESSION_ACTIVE) {
    echo "会话已启动<br>";
} else {
    echo "会话启动失败<br>";
}
?>

存储和读取会话数据

php
<?php
session_start();

// 存储会话数据
$_SESSION['username'] = '张三';
$_SESSION['user_id'] = 12345;
$_SESSION['is_logged_in'] = true;

// 存储数组
$_SESSION['user'] = [
    'name' => '张三',
    'age' => 18,
    'email' => 'zhangsan@example.com'
];

// 读取会话数据
echo "用户名: " . $_SESSION['username'] . "<br>";
echo "用户ID: " . $_SESSION['user_id'] . "<br>";
echo "登录状态: " . ($_SESSION['is_logged_in'] ? '已登录' : '未登录') . "<br>";
echo "用户邮箱: " . $_SESSION['user']['email'] . "<br>";

// 检查会话变量是否存在
if (isset($_SESSION['username'])) {
    echo "欢迎," . $_SESSION['username'] . "!<br>";
} else {
    echo "请先登录<br>";
}
?>

修改和删除会话数据

php
<?php
session_start();

// 修改会话数据
$_SESSION['username'] = '李四';
echo "用户名已修改为: " . $_SESSION['username'] . "<br>";

// 删除单个会话变量
unset($_SESSION['user_id']);
echo "用户ID已删除<br>";

// 清空所有会话数据
session_unset();
echo "所有会话数据已清空<br>";

// 销毁会话
session_destroy();
echo "会话已销毁<br>";
?>

实际应用示例

php
<?php
session_start();

// 登录功能
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_POST['username']) && isset($_POST['password'])) {
        $username = $_POST['username'];
        $password = $_POST['password'];
        
        // 模拟验证
        if ($username === 'admin' && $password === '123456') {
            // 存储用户信息到会话
            $_SESSION['username'] = $username;
            $_SESSION['is_logged_in'] = true;
            $_SESSION['login_time'] = time();
            echo "登录成功!<br>";
        } else {
            echo "用户名或密码错误<br>";
        }
    }
}

// 检查登录状态
if (isset($_SESSION['is_logged_in']) && $_SESSION['is_logged_in']) {
    echo "欢迎回来," . $_SESSION['username'] . "!<br>";
    echo "登录时间: " . date('Y-m-d H:i:s', $_SESSION['login_time']) . "<br>";
    echo "<a href='logout.php'>退出登录</a><br>";
} else {
    echo "请登录<br>";
    ?>
    <form action="" method="post">
        <label>用户名: <input type="text" name="username"></label><br>
        <label>密码: <input type="password" name="password"></label><br>
        <input type="submit" value="登录">
    </form>
    <?php
}
?>

退出登录

php
<?php
session_start();

// 清空会话数据
session_unset();

// 销毁会话
session_destroy();

echo "已退出登录<br>";
echo "<a href='login.php'>重新登录</a><br>";
?>

注意事项

  1. 启动会话session_start() 必须在所有输出之前调用
  2. 安全性:Session 存储在服务器端,比 Cookie 更安全,但仍需注意会话固定攻击
  3. 过期时间:可以通过 session.gc_maxlifetime 配置会话过期时间
  4. 会话 ID:使用 session_regenerate_id() 定期更新会话 ID,提高安全性
  5. 存储限制:Session 存储在服务器内存或临时文件中,不适合存储大量数据
  6. 分布式环境:在分布式环境中,需要使用共享存储(如 Redis)来存储会话数据

练习

  1. 实现一个完整的登录/退出系统,使用 Session 管理用户状态
  2. 为会话添加过期时间控制
  3. 实现会话 ID 定期更新,提高安全性

© 2026 编程马·菜鸟教程 版权所有