PHP 中 $_SESSION 变量使用详解
$_SESSION 是 PHP 中用于存取会话信息的超全局数组变量,它允许在不同页面间保持用户数据。
一、基本使用方法
1. 启动会话
<?php // 必须在脚本开头调用 session_start();
2. 存储会话数据
// 存储简单值
$_SESSION['username'] = 'john_doe';
// 存储数组
$_SESSION['user_info'] = [
'id' => 1001,
'email' => 'john@example.com',
'role' => 'admin'
];
// 存储对象
class User {}
$user = new User();
$_SESSION['user_obj'] = $user;3. 读取会话数据
// 读取简单值 echo $_SESSION['username']; // 输出: john_doe // 读取数组元素 echo $_SESSION['user_info']['email']; // 输出: john@example.com // 读取对象属性 echo $_SESSION['user_obj']->property;
4. 检查会话数据是否存在
if (isset($_SESSION['username'])) {
echo '用户已登录';
}
// 检查空值
if (empty($_SESSION['cart_items'])) {
echo '购物车为空';
}5. 删除会话数据
// 删除单个值 unset($_SESSION['username']); // 删除整个会话 session_destroy();
二、实际应用示例
1. 用户登录系统
<?php
session_start();
// 用户登录验证
function login($username, $password) {
// 验证逻辑...
if ($valid) {
$_SESSION['user'] = [
'id' => $user_id,
'name' => $username,
'last_login' => time()
];
return true;
}
return false;
}
// 检查登录状态
function isLoggedIn() {
return isset($_SESSION['user']);
}
// 获取当前用户
function currentUser() {
return $_SESSION['user'] ?? null;
}
// 用户登出
function logout() {
unset($_SESSION['user']);
}2. 购物车实现
<?php
session_start();
// 初始化购物车
if (!isset($_SESSION['cart'])) {
$_SESSION['cart'] = [];
}
// 添加商品
function addToCart($product_id, $quantity = 1) {
if (isset($_SESSION['cart'][$product_id])) {
$_SESSION['cart'][$product_id] += $quantity;
} else {
$_SESSION['cart'][$product_id] = $quantity;
}
}
// 移除商品
function removeFromCart($product_id) {
unset($_SESSION['cart'][$product_id]);
}
// 获取购物车内容
function getCart() {
return $_SESSION['cart'];
}
// 清空购物车
function clearCart() {
$_SESSION['cart'] = [];
}三、高级用法
1. 会话数据序列化
// 存储前序列化复杂数据 $_SESSION['complex_data'] = serialize($complexObject); // 读取时反序列化 $object = unserialize($_SESSION['complex_data']);
2. 会话数据加密
// 加密存储
function encryptSessionData($key, $data) {
$iv = openssl_random_pseudo_bytes(16);
$encrypted = openssl_encrypt($data, 'AES-256-CBC', $key, 0, $iv);
return base64_encode($iv.$encrypted);
}
// 解密读取
function decryptSessionData($key, $data) {
$data = base64_decode($data);
$iv = substr($data, 0, 16);
$encrypted = substr($data, 16);
return openssl_decrypt($encrypted, 'AES-256-CBC', $key, 0, $iv);
}四、注意事项
调用顺序
session_start()必须在任何输出之前调用包括空格和BOM头都会导致错误
数据大小限制
默认会话数据大小受
session.gc_maxlifetime限制大量数据应考虑数据库存储
并发问题
默认文件存储使用文件锁
高并发场景考虑Redis等替代方案
安全考虑
不要存储敏感信息如密码
使用
session_regenerate_id()防止会话固定攻击性能优化
仅存储必要数据
大数据量考虑手动调用
session_write_close()跨页面使用
确保每个使用会话的页面都调用了
session_start()相同的
session.name配置
通过合理使用 $_SESSION 变量,可以构建功能强大的会话管理系统,实现用户状态保持和数据共享。