在PHP的会话管理中,除了直接操作$_SESSION超全局数组外,还有一些相关函数可以辅助管理会话数据。以下是主要的$_SESSION相关函数及其用法示例:
session_start() - 启动新会话或恢复现有会话
session_start(); // 必须在脚本开头调用,输出任何内容前
session_id() - 获取/设置当前会话ID
$current_id = session_id(); // 获取
session_id("custom123"); // 设置(必须在session_start()前调用)session_name() - 获取/设置会话名称(PHPSESSID)
$name = session_name(); // 获取
session_name("MYSESSID"); // 设置(必须在session_start()前)session_regenerate_id() - 更新会话ID防止固定攻击
session_regenerate_id(true); // 参数true表示删除旧会话文件
session_unset() - 清空$_SESSION数组(不删除会话文件)
session_unset(); // 等同于$_SESSION = array()
session_destroy() - 彻底销毁会话(需配合session_unset)
session_unset(); session_destroy(); setcookie(session_name(), '', time()-3600); // 删除客户端cookie
session_encode()/session_decode() - 会话数据序列化
$data = session_encode(); // 序列化$_SESSION为字符串 session_decode($data); // 反序列化字符串到$_SESSION
session_set_save_handler() - 自定义会话存储方式
session_set_save_handler( [$handler, 'open'], [$handler, 'close'], [$handler, 'read'], [$handler, 'write'], [$handler, 'destroy'], [$handler, 'gc'] );
session_status() - 检查会话状态
if (session_status() === PHP_SESSION_ACTIVE) {
echo "会话已启动";
}session_write_close() - 提前写入会话数据
$_SESSION['data'] = 'value'; session_write_close(); // 立即保存避免锁竞争
session_cache_limiter() - 控制客户端缓存
session_cache_limiter('private_no_expire');session_set_cookie_params() - 设置会话cookie参数
session_set_cookie_params([ 'lifetime' => 86400, 'path' => '/', 'domain' => '.example.com', 'secure' => true, 'httponly' => true, 'samesite' => 'Strict' ]);
session_get_cookie_params() - 获取当前cookie设置
$params = session_get_cookie_params();
session_abort() - 放弃会话更改(不保存)
session_abort(); // 类似事务回滚
session_reset() - 重置$_SESSION为原始状态
session_reset(); // 重新从存储加载数据
注意事项:
所有会话函数必须在session_start()之后调用(除session_id/set_cookie_params等配置函数)
修改会话数据后会自动保存,但显式调用session_write_close()可提高并发性能
对象序列化需要类定义在反序列化时可用
默认使用文件存储会话,生产环境建议使用Redis等更高效的存储方式。