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

PHP会话24小时保持:手机锁屏后自动失效问题求助

问题:手机锁屏2分钟后PHP会话自动结束,无法保持24小时活跃

我需要让PHP会话保持24小时不中断,在电脑或屏幕常亮的手机上功能正常,但手机锁屏两分钟后会话就会自动结束。以下是相关配置与代码:

1. php.ini 配置

session.cookie_lifetime 86400 86400
session.gc_maxlifetime 86400 86400

2. 各页面开头的代码

$lifetime = 86400; // 24小时(秒)

if (session_status() == PHP_SESSION_NONE) {   
    session_start(); // 会话未启动则开始会话
}

// 重置会话cookie,使其在最后一次访问后24小时过期
setcookie(session_name(), session_id(), time() + $lifetime);

// 验证会话有效性(检查必要变量是否存在)
if (!isset($_SESSION["usuarioNome"]) || !isset($_SESSION["usuarioSenha"])) {
    // 会话无效则跳转到登录页
    header("Location: ../index.html");
    exit;
}

// 引入数据库连接文件并设置时区
require_once 'conexao.php';
date_default_timezone_set('Europe/Lisbon');

3. 前端会话活跃检查函数

$(function(){
  setInterval(function(){
      $.ajax({
          url: 'logout_status.php',
          method: 'get',
          dataType: 'json'
      })
      .done(function(retorno){
          
      })
      .fail(function(erro){
          window.location.href = '../index.html';
          console.log(erro);
      });
  }, 60000);
});

4. logout_status.php 代码

require("validsessao.php");
$response = array("logout" => isset($_SESSION['usuarioNome']) ? true : null);
header('Content-Type: application/json');
echo json_encode($response);

所有功能在常规场景下正常,但手机登录后锁屏,两分钟后会话意外结束。

补充排查信息

我在logout_status.php中添加了日志代码,屏幕常亮时会生成日志并显示会话活跃,但锁屏后不再写入日志:

require("validsessao.php");
$response = array("logout" => isset($_SESSION['usuarioNome']) ? true : null);
header('Content-Type: application/json');
echo json_encode($response);

if($_SESSION['usuarioId'] == 350){
    $log_file = '/var/www/html/assets/utente/sessao_logs.txt';  // 日志文件路径

    $log_data = sprintf(
        "[%s] 会话ID: %s, 用户名: %s, 状态: %s\n",
        date("Y-m-d H:i:s"),
        session_id(),
        isset($_SESSION['usuarioNome']) ? $_SESSION['usuarioNome'] : '未获取',
        session_status() == PHP_SESSION_ACTIVE ? '活跃' : '非活跃'
    );

    file_put_contents($log_file, $log_data, FILE_APPEND);
}

解决方案

核心原因

手机锁屏后,浏览器进入省电模式会暂停后台脚本执行,导致前端每分钟一次的AJAX心跳请求无法触发。服务器端因长时间未收到用户请求,会话超过闲置阈值后被垃圾回收(GC),或者会话cookie未及时刷新而失效。

修复步骤

  1. 完善会话Cookie参数
    当前setcookie调用缺少必要参数,会影响手机浏览器对Cookie的持久化策略,修改为:
setcookie(
    session_name(),
    session_id(),
    [
        'expires' => time() + $lifetime,
        'path' => '/', // 确保全站有效
        'domain' => $_SERVER['HTTP_HOST'],
        'secure' => true, // HTTPS环境下必须开启
        'httponly' => true, // 防止XSS窃取Cookie
        'samesite' => 'Lax' // 避免浏览器拦截跨站Cookie
    ]
);
  1. 调整PHP会话GC策略
    PHP会话GC是概率触发的,可降低触发概率避免误回收,或改用Redis/Memcached存储会话:
session.gc_probability = 1
session.gc_divisor = 10000 // 触发概率降至万分之一
  1. 适配手机后台的心跳机制
    改用Navigator.sendBeacon发送心跳请求,它在页面后台/锁屏时仍能尝试发送:
$(function(){
  setInterval(function(){
      navigator.sendBeacon('logout_status.php', '');
  }, 30000); // 缩短间隔到30秒,降低闲置风险
});

同时修改logout_status.php兼容POST请求:

require("validsessao.php");
$response = array("logout" => isset($_SESSION['usuarioNome']) ? true : null);
header('Content-Type: application/json');
echo json_encode($response);

// 日志代码保持不变
  1. 确保会话正确启动
    在validsessao.php开头添加会话启动逻辑:
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:24:49