xampp默认php session生存期为1440秒(24分钟),但实际失效由session.gc_maxlifetime(服务端文件清理阈值)和session.cookie_lifetime(客户端cookie有效期)共同决定,二者必须同步修改并重启apache才生效。

XAMPP 默认的 PHP Session 生存期是 1440 秒(24 分钟),但这个值只是理论过期时间,实际失效时机受两个独立机制控制:服务端文件清理(session.gc_maxlifetime)和客户端 Cookie 有效期(session.cookie_lifetime)。只改一个,大概率没用。
修改 session.gc_maxlifetime(服务端 session 文件存活时间)
这是决定服务器何时“认为” session 过期的核心参数。XAMPP 的 php.ini 通常位于:XAMPP\php\php.ini(Windows)或 /Applications/XAMPP/xamppfiles/etc/php.ini(macOS)。
- 用文本编辑器打开该文件,搜索
session.gc_maxlifetime - 默认行类似:
session.gc_maxlifetime = 1440 - 改为所需秒数,例如 2 小时:
session.gc_maxlifetime = 7200 - 保存后必须重启 Apache(通过 XAMPP Control Panel 点击 Stop/Start)才能生效
- 注意:该值只影响垃圾回收时是否删除
/tmp/sess_*文件,不保证“立刻销毁”。回收触发概率由session.gc_probability/session.gc_divisor控制,默认 1/100,所以可能延迟很久才清理
同步修改 session.cookie_lifetime(客户端 Cookie 过期时间)
如果只改服务端,但浏览器里的 PHPSESSID cookie 在关闭后就消失(因为 session.cookie_lifetime = 0 是默认值),那用户一关浏览器,下次访问就拿不到有效的 session ID,等于白设。
- 在同一份
php.ini中搜索session.cookie_lifetime - 默认是
session.cookie_lifetime = 0,表示“会话 cookie”,随浏览器关闭而丢弃 - 要让 Cookie 持久化,比如保留 2 小时,改成:
session.cookie_lifetime = 7200 - 同样需要重启 Apache
- 验证方式:登录后打开浏览器 DevTools → Application → Cookies,查看
PHPSESSID的 “Expires / Max-Age” 字段是否变成具体时间(而非 Session)
运行时动态设置(适合开发调试,不推荐生产)
如果你无法修改 php.ini(如共享环境),可在脚本开头用 ini_set() 覆盖,但必须在 session_start() 之前调用:
<?php // 设置服务端存活时间(单位:秒)
ini_set('session.gc_maxlifetime', 7200);
// 设置客户端 Cookie 存活时间(单位:秒)
ini_set('session.cookie_lifetime', 7200);
// 必须在 session_start() 前设置 cookie 参数
session_set_cookie_params(7200, '/');
session_start();
?>
-
session_set_cookie_params()的第一个参数对应session.cookie_lifetime,第二个是 path,第三个是 domain(可选) - 这种方式对 CLI 或某些 SAPI 可能无效;且每次请求都要执行,性能略低
- 如果使用
session.use_cookies = 0(即 URL 传参),cookie_lifetime完全不生效
为什么改了还是 24 分钟就失效?常见漏点
最常被忽略的是:XAMPP 实际加载的 php.ini 不一定是你以为的那个。尤其 Windows 下可能有多个副本(如 php.ini-development 和 php.ini-production),Apache 加载的是被重命名启用的那个。
- 新建一个
info.php,内容为<?php phpinfo(); ?>,用浏览器访问,搜索 “Loaded Configuration File”,确认路径 - 检查
session.save_path是否指向可写目录(如XAMPP\tmp),否则 session 文件根本写不进去,看起来像“立刻过期” - 确保没有其他地方调用
session_destroy()或覆盖了$_SESSION导致提前终止 - ThinkPHP 等框架可能自行封装 session 初始化逻辑,绕过全局配置,需查其文档或源码中对
session_set_cookie_params()的调用
真正起效的关键不是“改一个值”,而是让服务端文件生命周期、客户端 Cookie 生命周期、以及 session 初始化流程三者对齐。任意一环断开,都会导致你看到“明明改了却没用”的现象。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











