php中$_session变量无需定义,赋值即创建;必须在任何输出前调用session_start(),且每次请求均需单独调用,否则跨页失效。

PHP 中 session 变量不是“定义”出来的,而是赋值后自动创建的
PHP 的 $_SESSION 是一个超全局数组,它本身在 session 启动后就存在;你不需要用 var $key 或 declare 去“定义”变量。只要 session_start() 已调用,直接给 $_SESSION['key'] 赋值即可注册该 session 变量。
常见错误现象:页面刷新后值丢失、报 Undefined index、或写入后读不到——基本都源于 session 未正确启动或作用域问题。
- 必须在任何输出(包括空格、BOM、
)之前调用session_start() -
$_SESSION只在当前会话生命周期内有效,关闭浏览器或 session 过期后自动清除 - 键名不能是数字索引(如
$_SESSION[0] = 'x'),否则可能被忽略或引发警告 - 值可以是字符串、数字、数组,但不能是资源(如
mysqli连接)或匿名函数
session_start() 必须出现在脚本最前面(且仅一次)
很多新手在 include 其他文件后再调用 session_start(),结果因已有输出导致失败,错误信息通常是:Warning: session_start(): Cannot send session cache limiter。
典型错误场景:HTML 头部已输出、配置文件里有 UTF-8 BOM、error_reporting(E_ALL) 触发了 notice 并提前输出。
- 检查 PHP 文件是否以 UTF-8 无 BOM 格式保存(尤其 Windows 编辑器容易带 BOM)
- 把
session_start()放在所有echo、print、HTML 和require之前 - 如果用了 Composer 自动加载或框架路由,确认中间件/引导流程中没有重复调用
session_start() - 调试时可用
headers_sent($file, $line)检查输出位置
$_SESSION 赋值后不生效?检查 session.save_path 和权限
即使 session_start() 没报错,$_SESSION['user_id'] = 123 写入后仍读不到,很可能是 session 数据根本没存成功。
PHP 默认用文件方式存储 session,路径由 session.save_path 配置决定。如果该目录不存在、不可写,或磁盘满,PHP 会静默失败(不报错,但数据不持久)。
- 用
var_dump(ini_get('session.save_path'))查看当前路径 - 执行
is_writable(ini_get('session.save_path'))确认可写 - Linux 下常见问题:web 服务器用户(如
www-data)对/var/lib/php/sessions无写权限 - 临时测试可设为当前目录:
ini_set('session.save_path', __DIR__ . '/sessions'),并确保该目录存在且可写
跨页面读取 session 变量前,别忘了 session_start()
每个需要访问 $_SESSION 的 PHP 脚本,都必须独立调用 session_start() —— 它不是“全局启用一次就永久有效”,而是每次请求都需要重新初始化 session 上下文。
容易忽略的点:AJAX 请求的 PHP 后端脚本、图片生成脚本(graph.php)、CLI 脚本(默认不共享 web session)都需单独处理。
- 不要假设“上个页面启过了,这里不用再启”
- 若用
session_id()手动传参(如 URL 中带PHPSESSID),要先session_id($id)再session_start() - CLI 模式下想复用 web session,需手动设置
session_id()并指定save_path,但不推荐——会破坏并发安全
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











