必须先调用 session_start(),否则 $_SESSION 无法读写;报“headers already sent”因函数前有输出;赋值后丢失是因 Cookie 未成功发送;资源不可存入,对象需 __sleep/__wakeup;销毁会话需同时清除服务端和客户端 Cookie。

必须先调用 session_start(),否则 $_SESSION 写不进数据、读不到值——这不是警告,是硬性限制。
为什么 session_start() 总报“headers already sent”?
这是最常见也最容易被忽略的错误:函数执行前不能有任何输出,包括空格、换行、BOM头、 标签甚至 UTF-8 的 BOM 字节。
- 检查 PHP 文件是否以
开头,前面**绝对不能有空行或空格** - 确认编辑器保存为 “UTF-8 无 BOM” 编码(尤其是 Windows 下的 Notepad++ 或 VS Code)
- 避免在
session_start()前使用echo、print、var_dump,哪怕只是调试用 - 如果用了
require/include,要检查被包含文件开头是否干净
$_SESSION 赋值后页面刷新就丢失?
不是赋值失败,而是会话未真正建立或 ID 未持久化。关键点在于:PHP 默认靠 Cookie 传递 PHPSESSID,但这个 Cookie 需要显式发送给浏览器才能生效。
由 ReMe 驱动的记忆管理系统,支持跨会话记忆持久化、自动应用用户偏好以及智能上下文压缩...
-
session_start()本身会尝试发 Cookie,但前提是没提前输出、且响应头未关闭 - 若用
header("Location: ...")跳转,确保跳转前已成功执行session_start()并写入数据 - 某些环境(如 CLI 模式、禁用 Cookie 的浏览器)下,
session_id()可能为空,需手动检查:if (session_status() === PHP_SESSION_NONE) { session_start(); } - 不要依赖
session.auto_start = 1,它会让所有脚本无差别开启会话,增加 I/O 开销且难以调试
存储数组、对象或资源时要注意什么?
$_SESSION 只能序列化标准变量类型。非标内容会静默丢弃或触发警告,但不会报错。
- 资源型变量(如
mysqli连接、文件句柄)无法存入$_SESSION,必须在每次请求中重建 - 对象需实现
__sleep()/__wakeup()才能完整序列化;否则只保留属性,方法丢失 - 大数组或长字符串会拖慢 session 文件读写,特别是默认的 file handler;高并发下建议改用
redis或memcached存储 - 敏感数据(如密码、token)不应直接存进
$_SESSION,至少应加密后再存
真正容易被忽略的是 session 生命周期与 GC(垃圾回收)的异步性:你调用 session_destroy() 只是清空当前脚本的 $_SESSION 数组并删除服务端文件,但浏览器里的 Cookie 还在,下次请求仍可能重建旧会话——除非你同时调用 setcookie(session_name(), '', time() - 3600) 主动过期客户端 Cookie。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










