
直接读取 $_SESSION 数组里的键就行,但前提是 session 已启动且变量已写入。
PHP 读取 SESSION 变量前必须调用 session_start()
不调用就直接访问 $_SESSION,会报 Undefined variable: _SESSION 或返回空数组。这不是权限或配置问题,是 PHP 的运行机制决定的——$_SESSION 不是全局自动可用的超全局变量,它依赖 session 子系统初始化。
- 必须在脚本最开头(至少在任何输出之前)调用
session_start() - 如果用了 output buffering,也要确保没意外输出(比如 UTF-8 BOM、空格、换行)
- Apache + mod_php 环境下,
session.auto_start = 1虽然能自动启动,但不推荐,容易和手动调用冲突,且 PHP 8.0+ 已废弃该配置
从 $_SESSION 读值要检查键是否存在
直接 $_SESSION['user_id'] 可能触发 Notice: Undefined index,尤其在用户未登录、页面跳转不完整、或上一步没 set 的情况下。
- 安全做法是先用
isset($_SESSION['key'])或array_key_exists('key', $_SESSION) - 如果需要默认值,用
$_SESSION['key'] ?? 'default'(PHP 7.0+)更简洁 - 注意:
empty($_SESSION['key'])会把0、'0'、false都判为“空”,不适合判断数值型 ID
SESSION 变量跨请求失效的常见原因
明明写了 $_SESSION['token'] = 'abc';,下个页面却读不到,大概率不是读法错,而是 session 没真正存住或没正确加载。
立即学习“PHP免费学习笔记(深入)”;
- 检查
session.save_path目录是否有写权限(Linux 下常见权限不足,导致 session 文件生成失败) - 确认浏览器是否禁用了 Cookie,或域名/路径不一致(如从
www.example.com写入,却在example.com读取) - 调用
session_write_close()后再做耗时操作,否则并发请求可能阻塞 session 文件锁,导致后续读取拿到旧值 - CLI 脚本里无法共享 Web 请求的 session(因为无 Cookie 上下文),别指望在命令行里读到网页设置的
$_SESSION
session 数据本身不加密、不校验完整性,读出来的东西信不信,得靠业务逻辑兜底;另外,$_SESSION 是引用传递,直接修改嵌套数组可能意外影响其他地方,真要深拷贝得用 unserialize(serialize($_SESSION)) 这类操作——不过绝大多数场景,真没必要碰这个复杂度。










