本文目录导读:

在 PHP 项目中,Session 的开启和配置主要涉及两个层面:运行时函数调用和 PHP 配置文件(php.ini)设置,下面详细说明:
开启 Session(核心函数)
在 PHP 脚本中,必须在向浏览器输出任何内容(包括 HTML、空格、echo 等)之前调用 session_start() 函数。
<?php // 必须在任何输出之前调用 session_start(); // 设置 session 变量 $_SESSION['username'] = 'admin'; $_SESSION['role'] = 'editor'; ?>
常见错误:
- 如果在
session_start()之前有输出(包括 BOM 头、空格、提前的echo),会报错:Cannot send session cookie。
配置文件(php.ini)关键配置
Session 的大部分行为由 php.ini 控制,以下是常用配置项及其说明:
1 基本设置
; 是否自动开启 session(建议设为 0,手动控制) session.auto_start = 0 ; session 保存方式(files | redis | memcached 等) session.save_handler = files ; session 文件保存路径(Linux 常用 /tmp,Windows 默认 C:\Windows\Temp) session.save_path = "/tmp" ; session 名称(用作 cookie 名称,默认 PHPSESSID) session.name = PHPSESSID
2 Cookie 相关设置
; session cookie 生命周期(秒),0 表示浏览器关闭即失效 session.cookie_lifetime = 0 ; cookie 有效路径(通常设为 / 表示整个站点) session.cookie_path = / ; cookie 有效域名(留空表示当前域名) session.cookie_domain = "" ; 是否只允许 HTTPS 传递 cookie(建议线上开启) session.cookie_secure = 0 ; 是否仅使用 HTTP 协议访问 cookie(防止 XSS 窃取,建议开启) session.cookie_httponly = 1 ; 同源策略(Strict | Lax | None) session.cookie_samesite = "Lax"
3 垃圾回收机制
; 多久后(秒)session 数据被视为垃圾 session.gc_maxlifetime = 1440 ; 默认 24 分钟 ; 每次 session 启动时,触发垃圾回收的概率(分子) session.gc_probability = 1 ; 每次 session 启动时,触发垃圾回收的概率(分母) session.gc_divisor = 1000 ; 即:1/1000 的概率触发 gc,生产环境概率太大可能影响性能
4 其他重要参数
; 是否使用 cookies 保存 session id(建议开启) session.use_cookies = 1 ; 是否仅在 cookie 中传递 session id(强烈建议开启,防止 URL 泄露) session.use_only_cookies = 1 ; session 编码方式(php|php_serialize|php_binary) session.serialize_handler = php ; 严格模式(防止未初始化 session id 被使用) session.use_strict_mode = 1 ; session id 长度(32-128) session.sid_length = 48 ; session id 使用的字符集 session.sid_bits_per_character = 6
完整示例:项目入口文件配置
假设你的项目入口是 index.php 或全局包含文件 common.php:
<?php
// 1. 启动 session
session_start();
// 2. 可选:设置超时逻辑(如果用户长时间不操作)
$sessionLifetime = 3600; // 1小时
if (isset($_SESSION['last_activity']) && (time() - $_SESSION['last_activity'] > $sessionLifetime)) {
// 超时,清空 session
session_unset();
session_destroy();
session_start();
}
$_SESSION['last_activity'] = time();
// 3. 后续业务逻辑...
高级配置示例(Redis 存储)
如果你想把 Session 存到 Redis,需要在 php.ini 中修改(前提 PHP 已安装 Redis 扩展):
session.save_handler = redis session.save_path = "tcp://127.0.0.1:6379?auth=yourpassword&prefix=PHPSESS:"
或者通过 PHP 代码动态设置:
<?php
ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://127.0.0.1:6379?auth=yourpassword&prefix=PHPSESS:');
session_start();
常见问题排查
| 问题 | 排查方向 |
|---|---|
| Session 无法启动 | 检查是否有输出在 session_start() 之前 |
| Session 频繁丢失 | 检查 session.gc_maxlifetime 是否太小 |
| 同域名下多个项目 Session 冲突 | 修改 session.name 为不同值 |
| Session 文件权限问题 | 确保 session.save_path 目录可写 |
建议:开发环境开启 session.auto_start = 0,在代码中显式调用 session_start(),便于控制 session 生命周期和调试。