PHP会话闲置超1小时后超时提示flash消息不显示问题求助
检查PHP服务端会话垃圾回收配置
查看php.ini中session.gc_maxlifetime参数的取值,该参数控制服务端多久会将闲置会话标记为垃圾并清理。如果该值小于你设置的1800秒(30分钟,多数环境默认值为1440秒即24分钟),闲置超过24分钟的会话就会被服务端直接删除。当用户1小时后访问页面时,$_SESSION["login_time_stamp"]已经不存在,checkInactivity的判断条件无法触发,不会走重定向到sessionExpired的逻辑,自然不会弹出flash提示。你测试几秒超时的场景时会话还未被GC回收,所以逻辑正常。
修复可以在session_start()前添加代码:ini_set('session.gc_maxlifetime', 3600);,或者直接修改php.ini的对应参数,保证取值大于1800。检查会话销毁后的flash存储逻辑
你当前的逻辑是先执行deleteSession(),内部调用了session_destroy()和session_unset()清空并销毁了当前会话。绝大多数PHP的flash消息实现都是将内容存在$_SESSION中,此时旧会话已经销毁,如果sessionExpired方法执行时没有重新开启新会话,flash消息就存储失败,跳转到登录页后自然读不到提示。
排查可以在sessionExpired方法的第一行添加session_start(),确认会话开启后再调用flash()存值。调试效率优化方案
不需要每次等待30分钟验证效果,先将超时判断if (time() - $_SESSION["login_time_stamp"] > 1800 )中的1800改为10,测试短超时场景下的逻辑是否通顺。同时可以在关键节点加日志记录:checkInactivity触发时记日志、sessionExpired执行时记日志、flash存值和取值的位置分别记日志,不需要等待即可定位问题所在环节。排查浏览器缓存问题
闲置1小时后用户首次访问页面时,可能浏览器直接加载了本地缓存的登录页,没有发送请求到服务端,导致重定向逻辑未触发。可以给登录页添加禁止缓存的响应头:header("Cache-Control: no-cache, no-store, must-revalidate"); header("Pragma: no-cache"); header("Expires: 0");避免浏览器缓存静态页面跳过服务端逻辑。
内容的提问来源于stack exchange,提问作者zootechdrum

