session.gc_probability与session.gc_divisor需配对设置才有效:默认1/1000概率过低,xampp本地开发建议设为1/100(即1%),并重启apache生效;仅调大gc_maxlifetime无法触发清理。

session.gc_probability 和 session.gc_divisor 怎么配才有效
在 XAMPP 中改了 session.gc_maxlifetime 却发现过期 session 文件还在,大概率是 session.gc_probability 和 session.gc_divisor 没配对。这两个值共同决定每次请求启动垃圾回收(GC)的概率,公式就是 gc_probability / gc_divisor。
默认配置通常是 session.gc_probability = 1、session.gc_divisor = 1000,也就是千分之一概率触发 GC —— 对低流量本地开发环境来说,可能一整天都等不到一次清理。
- 想让 GC 更积极:设为
session.gc_probability = 1、session.gc_divisor = 100(1% 概率),适合调试阶段快速验证 session 生效/销毁逻辑 - 不建议设成
1/1或100/100:每次请求都扫一遍 session 目录,XAMPP 本就不是为高并发设计的,I/O 延迟会明显拖慢页面响应 - 改完必须重启 Apache:XAMPP 控制面板里点 Stop 再 Start,仅重载 PHP 配置(如通过 php.ini 编辑后点“应用”)不会生效
怎么确认当前 session.save_path 和实际文件位置
XAMPP 的 session 默认路径不固定,Windows 下可能是 C:\xampp\tmp,macOS 下可能是 /Applications/XAMPP/xamppfiles/temp,但具体以 PHP 运行时读取的为准。硬写死路径去清理,容易删错目录或漏清。
最稳妥的方式是运行一段 PHP 脚本查真实路径:
<?php echo session_save_path(); ?>
把这段代码存为 check-session-path.php,用浏览器访问它,输出的就是当前生效的 session.save_path。注意:这个路径必须有写权限,否则 session 文件根本写不进去,更别提清理了。
- 如果输出为空,说明没启用 session 模块,检查 php.ini 中是否启用了
extension=php_session.dll(Windows)或extension=session.so(macOS/Linux) - 如果输出的是相对路径(如
./tmp),要结合 Web 服务器工作目录来定位,通常在C:\xampp\htdocs或/Applications/XAMPP/xamppfiles/htdocs下找 - session 文件名统一以
sess_开头,例如sess_abc123def456,可用dir sess_*(Windows)或ls sess_*(macOS/Linux)快速确认
用 find 命令定时清理比依赖 PHP GC 更可靠
PHP 内置 GC 是概率性触发,且只在新会话开始(session_start())时才可能执行。XAMPP 本地开发常有长时间无请求的情况,导致过期文件堆积。绕过 PHP,直接用系统命令定期扫描删除,才是稳态方案。
在 XAMPP 自带的终端(Windows 用 XAMPP Control Panel 的 Shell,macOS 用 Terminal 进入 XAMPP 目录)中执行:
find /Applications/XAMPP/xamppfiles/temp -name "sess_*" -mmin +30 -delete
上面这行命令表示:清理 /Applications/XAMPP/xamppfiles/temp 下修改时间超过 30 分钟的所有 session 文件。Windows 用户需换用 PowerShell 或 Git Bash,并把 find 替为 forfiles:
forfiles /p "C:\xampp\tmp" /s /m "sess_*" /d -1 /c "cmd /c del @path"
-
-mmin +30比-mtime +1更精确:session 文件的修改时间(mtime)即最后访问时间,用分钟级判断比按天更贴合session.gc_maxlifetime设置(比如你设了 1440 秒,即 24 分钟) - 务必先测试再加
-delete:去掉该参数,只用-print或echo @path看会删哪些文件,避免误删 - 不要把清理命令塞进
php.ini或自动加载脚本里:那属于运行时行为,和 GC 一样不可控;应作为独立维护动作执行
为什么改了 php.ini 但 phpinfo() 不显示新值
常见原因是 XAMPP 加载了错误的 php.ini。XAMPP 可能同时存在多个配置文件:C:\xampp\php\php.ini(CLI 用)、C:\xampp\apache\bin\php.ini(Apache 模块用),而网页实际走的是后者。
确认方法:新建 phpinfo.php,内容为 <?php phpinfo(); ?>,访问后搜索 “Loaded Configuration File”,看路径指向哪一份。
- 如果改的是 CLI 的 php.ini,但 Apache 用的是另一份,那所有网页端 session 行为都不会受影响
- Windows 下注意文件权限:用记事本直接编辑可能保存失败,建议用 VS Code、Notepad++ 等以管理员身份打开再改
- macOS 上 XAMPP 的 php.ini 有时被符号链接指向
/etc/php.ini,改错地方会导致无效
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











