PHP Session 全面详解
1. 什么是 Session?
Session(会话)是一种存储在服务器端的用户数据机制,可以在多个页面间保持用户状态。它通常用于用户身份验证、购物车管理等应用场景。
2. Session 的工作原理
- 服务器端创建 Session
服务器生成一个唯一的Session ID并存储用户数据。 - 客户端存储
Session ID
PHP 通过 Cookie(默认名PHPSESSID)将Session ID发送给用户浏览器。 - 用户访问网站时,服务器通过
Session ID识别用户
服务器根据Session ID读取对应的 Session 数据。
3. 启动 Session
方式 1:session_start()
在使用 $_SESSION 之前,必须调用 session_start():
session_start();
$_SESSION["username"] = "JohnDoe";
echo "Session 已创建";
注意:
session_start()必须在 HTML 代码或echo之前调用,否则会出现 “Headers already sent” 错误。
方式 2:session_id()(可选)
如果需要手动设置 Session ID,可以使用:
session_id("custom_session_id");
session_start();
4. 读取 Session
使用 $_SESSION 超全局数组:
session_start();
if (isset($_SESSION["username"])) {
echo "当前用户:" . $_SESSION["username"];
} else {
echo "未设置 Session";
}
5. 销毁 Session
方式 1:删除某个 Session 变量
session_start();
unset($_SESSION["username"]);
方式 2:彻底销毁 Session
session_start();
session_unset(); // 清空所有 Session 变量
session_destroy(); // 彻底销毁 Session
注意:
session_destroy()不会删除浏览器中的Session ID,但会让服务器不再识别该 ID。
6. Session 配置
PHP 的 Session 行为可以通过 php.ini 配置:
session.gc_maxlifetime = 1440 ; 默认 24 分钟(秒)
session.save_path = "/var/lib/php/sessions" ; Session 存储路径
session.cookie_lifetime = 0 ; 0 表示浏览器关闭后删除
session.use_cookies = 1 ; 是否使用 Cookie 记录 Session ID
session.cookie_secure = 1 ; 仅在 HTTPS 连接时传输
session.cookie_httponly = 1 ; 禁止 JavaScript 访问(防范 XSS)
session.use_strict_mode = 1 ; 强制使用唯一 Session ID(增强安全性)
你也可以在代码中动态修改:
ini_set("session.gc_maxlifetime", 3600); // 设置 Session 1 小时过期
ini_set("session.save_path", "/tmp"); // 自定义 Session 存储路径
7. 自定义 Session 处理
PHP 默认将 Session 存储在服务器文件系统中,你可以使用数据库或 Redis 存储。
方式 1:存储到数据库
session_set_save_handler(
"open",
"close",
"read",
"write",
"destroy",
"gc"
);
你可以重写这些回调函数来管理 Session 数据。
方式 2:存储到 Redis(推荐)
ini_set("session.save_handler", "redis");
ini_set("session.save_path", "tcp://127.0.0.1:6379");
session_start();
8. Session 与 Cookie 的区别
| 对比项 | Session | Cookie |
|---|---|---|
| 存储位置 | 服务器端 | 客户端浏览器 |
| 适用范围 | 仅限当前会话 | 可跨会话持久存储 |
| 过期时间 | 默认浏览器关闭即销毁 | 可手动设置 |
| 安全性 | 更安全,不暴露数据 | 易被篡改 |
9. 常见问题
Q1: session_start() 报错?
- 确保
session_start()在 任何输出之前 运行。 - 确保
php.ini中session.save_path可写。
Q2: Session 无法保持?
- 可能是浏览器禁用了 Cookie(Session 依赖
PHPSESSID)。 - 服务器
session.gc_maxlifetime设置过短,导致自动清理。
10. 参考资料
更多详细内容请关注其他相关文章!