Appearance
10.2 Session 原理与使用
Session 是一种在服务器端存储用户状态的机制,用于跟踪用户会话和存储用户信息。
Session 的原理
- 服务器为每个用户创建一个唯一的会话 ID
- 服务器将用户数据存储在服务器端
- 会话 ID 通常通过 Cookie 发送给客户端
- 客户端在后续请求中携带会话 ID
- 服务器根据会话 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>";
?>注意事项
- 启动会话:
session_start()必须在所有输出之前调用 - 安全性:Session 存储在服务器端,比 Cookie 更安全,但仍需注意会话固定攻击
- 过期时间:可以通过
session.gc_maxlifetime配置会话过期时间 - 会话 ID:使用
session_regenerate_id()定期更新会话 ID,提高安全性 - 存储限制:Session 存储在服务器内存或临时文件中,不适合存储大量数据
- 分布式环境:在分布式环境中,需要使用共享存储(如 Redis)来存储会话数据
练习
- 实现一个完整的登录/退出系统,使用 Session 管理用户状态
- 为会话添加过期时间控制
- 实现会话 ID 定期更新,提高安全性
