PHP操作session必须先调用session_start(),否则$_SESSION读写无效且易触发“headers already sent”错误;存取直接操作$_SESSION数组;销毁需三步:清空$_SESSION、删除cookie、调用session_destroy()。

PHP 操作 session 的核心是 session_start(),没调用它,后续所有 $_SESSION 读写都无效,且可能触发“headers already sent”错误。
必须先调用 session_start() 才能操作会话
PHP 不像某些语言自动开启 session。每次需要读写 $_SESSION 前,都得显式启动会话 —— 否则 $_SESSION 是空数组,赋值也不生效。
- 它必须在任何输出(包括空格、BOM、
echo、HTML)之前调用,否则报错Warning: session_start(): Cannot send session cache limiter - 如果已启用
session.auto_start = 1(不推荐),可跳过,但该配置已被 PHP 8.0 废弃 - 同一请求中多次调用
session_start()会警告,但不会中断执行
存取 session 数据:直接读写 $_SESSION 数组
$_SESSION 是超全局数组,启动后即可按键名存取,无需序列化或编码。
- 存:直接赋值,如
$_SESSION['user_id'] = 123; - 取:直接访问,如
$uid = $_SESSION['user_id'] ?? null; - 删单个键:
unset($_SESSION['token']); - 清空全部(保留 session ID):
$_SESSION = [];
session_start(); $_SESSION['username'] = 'alice'; $_SESSION['login_time'] = time();// 安全取值,避免未定义索引 Notice $username = $_SESSION['username'] ?? 'guest';
销毁 session:三步缺一不可
仅 session_destroy() 不够 —— 它只删服务端数据,客户端 cookie 仍存在,下次请求可能复用旧 ID 继续会话。
立即学习“PHP免费学习笔记(深入)”;
- 清除当前脚本中的
$_SESSION内容:$_SESSION = []; - 删除 session cookie:
setcookie(session_name(), '', time() - 3600, '/'); - 销毁服务端存储:
session_destroy();
session_start();// 清空数据 $_SESSION = [];
// 删除客户端 cookie(注意路径和域要匹配创建时) $param = session_get_cookie_params(); setcookie( session_name(), '', time() - 3600, $param['path'], $param['domain'], $param['secure'], $param['httponly'] );
// 销毁服务端 session 文件或记录 session_destroy();
常见坑:session ID 未更新、跨域/子域失效、PHP-FPM 缓存干扰
session 看似简单,但实际部署中容易因环境配置出问题:
- 登录后没调用
session_regenerate_id(true),旧 session ID 仍可用,有会话固定风险 - 子域名间共享 session 需统一设置
session.cookie_domain = '.example.com',否则user.example.com和api.example.com视为不同会话 - 使用 PHP-FPM 时,若
php_admin_value[session.save_path]权限不对,session 文件写入失败,但无明显报错 —— 查看session_save_path()返回值和磁盘权限 -
session.use_cookies = 0时依赖 URL 传参(PHPSESSID=xxx),易泄露且不安全,现代项目应禁用
session 的可靠性高度依赖服务器配置和调用时机,尤其在重定向(如登录后 header('Location: ...'))场景下,务必确认 session_start() 已执行、数据已写入、ID 已刷新。











