如何防止PHP会话过期?已尝试多种方法无效,使用GoDaddy主机
修复会话短时间过期问题
你遇到的问题本质是GoDaddy共享主机的全局会话回收机制导致的:共享服务器默认所有站点共用同一个会话文件存储目录,只要同服务器其他站点的session.gc_maxlifetime配置更短,GC触发时会统一清理所有超时的会话文件,你单个站点修改的配置不会生效。按以下步骤修改即可解决:
- 在你的站点根目录创建一个不可被公开访问的独立会话存储目录,例如命名为
my_sessions,将目录权限设置为700,避免其他用户读取你的会话数据。
补充:在
my_sessions目录下新建.htaccess文件,写入deny from all,禁止外部直接访问该目录下的所有文件。
- 所有调用
session_start()的PHP文件(包括你的refreshSession.php),在最顶部添加以下配置:
// 优先使用自定义的会话存储目录,脱离全局回收规则限制 session_save_path($_SERVER['DOCUMENT_ROOT'] . '/my_sessions'); // 配置会话Cookie参数:有效期设为0代表浏览器关闭前有效,httponly开启避免XSS盗号 session_set_cookie_params(0, '/', $_SERVER['HTTP_HOST'], isset($_SERVER["HTTPS"]), true); // 自定义会话最大生命周期,这里设为30天可按需调整 ini_set('session.gc_maxlifetime', 86400 * 30); // 配置GC触发概率 ini_set('session.gc_probability', 1); ini_set('session.gc_divisor', 100); // 所有配置加载完成后再启动会话 session_start();
- 调整你的前端AJAX轮询间隔,确保间隔时间小于你设置的
session.gc_maxlifetime,例如上面配置了30天有效期的话,轮询间隔可调整为每24小时一次即可,避免不必要的请求浪费。
实现用户直到主动登出才掉线的需求
不要依赖PHP原生会话实现长效登录,会话本身设计就是临时存储机制,建议通过长效Cookie+数据库校验的方案实现:
- 你的用户表新增两个字段:
remember_token(字符串类型,长度至少64位)、token_expire(datetime类型)。 - 用户登录时如果勾选「记住我」选项,生成一个随机不可预测的加密字符串作为token,将token和过期时间(比如设为1年后)写入对应用户的数据库字段,同时给用户浏览器种下两个Cookie:
user_id(存用户ID,可明文)、remember_token(存生成的加密token,Cookie有效期设为1年,开启httponly和https属性)。 - 每次页面初始化时,优先判断session中是否有用户登录信息,如果没有就读取Cookie中的
user_id和remember_token,和数据库中存储的token比对,校验通过且token未过期的话,自动为用户重建会话,实现免登录。 - 用户主动点击登出时,清空数据库中对应用户的
remember_token和token_expire字段,同时删除用户浏览器中的两个长效Cookie即可。
内容的提问来源于stack exchange,提问作者Donald Faulknor
相关产品推荐
相关产品推荐

