PHP Session 全面详解
                           
天天向上
发布: 2025-03-20 23:59:03

原创
12 人浏览过

1. 什么是 Session?

Session(会话)是一种存储在服务器端的用户数据机制,可以在多个页面间保持用户状态。它通常用于用户身份验证、购物车管理等应用场景。


2. Session 的工作原理

  1. 服务器端创建 Session
    服务器生成一个唯一的 Session ID 并存储用户数据。
  2. 客户端存储 Session ID
    PHP 通过 Cookie(默认名 PHPSESSID)将 Session ID 发送给用户浏览器。
  3. 用户访问网站时,服务器通过 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 的区别

对比项SessionCookie
存储位置服务器端客户端浏览器
适用范围仅限当前会话可跨会话持久存储
过期时间默认浏览器关闭即销毁可手动设置
安全性更安全,不暴露数据易被篡改

9. 常见问题

Q1: session_start() 报错?

  • 确保 session_start()任何输出之前 运行。
  • 确保 php.inisession.save_path 可写。

Q2: Session 无法保持?

  • 可能是浏览器禁用了 Cookie(Session 依赖 PHPSESSID)。
  • 服务器 session.gc_maxlifetime 设置过短,导致自动清理。

10. 参考资料

更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *