严重影响前台会员登录体验
一、即使后台设置了会员登录时间15天,网站application/config已经修改
expire'=>1296000
admin/conf/session_conf.php已经修改
后台会员管理登录设置时间也改成1296000
php.ini已经修改expire'=>1296000
session.gc_maxlifetime = 1296000
session.cookie_lifetime = 1296000
php的GC 关了 session.gc_probability = 0
宝塔没有计划任务,前台会员登录后,每天会员会被自动踢出,需要反复登录。
经排查,是 clear_session_file() 函数被多处调用,在清理后台过期 Session 时,误删了前台会员的 Session 文件。
二、原因分析
1 Session 存储未隔离
前后台 Session 默认共用同一个目录(如 data/session/),但清理逻辑使用后台的过期时间(web_login_expiretime 或 login_expire = 172800)统一判断所有 sess文件,导致前台长生命周期的 Session 被提前删除。
2 clear_session_file() 被散落在 4 个不同模块中调用
文件位置 触发条件
① application/admin/logic/AjaxLogic.php → login_handle() 后台登录页加载
② application/api/logic/DdosApiLogic.php → ddos_arrange_files() API 层文件整理(高频触发)
③ application/admin/controller/Security.php → POST 操作 后台安全模块提交
④ application/api/controller/Ajax.php → clear_session() 任何 AJAX POST 请求
其中 ② 和 ④ 位于 API 模块,前台请求即可触发,不需要后台登录权限。
3 函数内部存在危险的兜底逻辑
if ('data/session' != $path && is_dir('data/session')) {
delFile('./data/session', true); // 递归清空整个目录
}
当 session.path 配置值与字符串 'data/session' 不完全一致时,会暴力清空整个 data/session/ 目录,不区分文件归属。
三、
1. 前台会员登录,生成sess文件
2. 等待超过后台登录过期时间(默认 172800 秒 = 48h,或数据库配置的更短时间)
3. 触发上述任一调用点(如访问后台登录页、API 请求等)
4. 前台会员的sess文件被 clear_session_file() 删除
5. 前台会员下次请求发现 Session 不存在,被踢回登录页
四、当前 clear_session_file() ,前后台 Session 未隔离 + 清理逻辑散落多处 + 触发面过广 + 存在暴力清空兜底代码。
建议官方在后续版本中:
1. 前后台 Session 目录默认分离
2. 统一清理入口,删除散落调用
3. 移除 delFile('./data/session', true) 兜底逻辑
4. 提供计划任务/中间件两种可选的 GC 方案