You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何防止PHP会话过期?已尝试多种方法无效,使用GoDaddy主机

修复会话短时间过期问题

你遇到的问题本质是GoDaddy共享主机的全局会话回收机制导致的:共享服务器默认所有站点共用同一个会话文件存储目录,只要同服务器其他站点的session.gc_maxlifetime配置更短,GC触发时会统一清理所有超时的会话文件,你单个站点修改的配置不会生效。按以下步骤修改即可解决:

  1. 在你的站点根目录创建一个不可被公开访问的独立会话存储目录,例如命名为my_sessions,将目录权限设置为700,避免其他用户读取你的会话数据。

补充:在my_sessions目录下新建.htaccess文件,写入deny from all,禁止外部直接访问该目录下的所有文件。

  1. 所有调用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();
  1. 调整你的前端AJAX轮询间隔,确保间隔时间小于你设置的session.gc_maxlifetime,例如上面配置了30天有效期的话,轮询间隔可调整为每24小时一次即可,避免不必要的请求浪费。

实现用户直到主动登出才掉线的需求

不要依赖PHP原生会话实现长效登录,会话本身设计就是临时存储机制,建议通过长效Cookie+数据库校验的方案实现:

  1. 你的用户表新增两个字段:remember_token(字符串类型,长度至少64位)、token_expire(datetime类型)。
  2. 用户登录时如果勾选「记住我」选项,生成一个随机不可预测的加密字符串作为token,将token和过期时间(比如设为1年后)写入对应用户的数据库字段,同时给用户浏览器种下两个Cookie:user_id(存用户ID,可明文)、remember_token(存生成的加密token,Cookie有效期设为1年,开启httponly和https属性)。
  3. 每次页面初始化时,优先判断session中是否有用户登录信息,如果没有就读取Cookie中的user_id和remember_token,和数据库中存储的token比对,校验通过且token未过期的话,自动为用户重建会话,实现免登录。
  4. 用户主动点击登出时,清空数据库中对应用户的remember_token和token_expire字段,同时删除用户浏览器中的两个长效Cookie即可。

内容的提问来源于stack exchange,提问作者Donald Faulknor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:15:06