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未及时刷新而失效。
修复步骤
- 完善会话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 ] );
- 调整PHP会话GC策略
PHP会话GC是概率触发的,可降低触发概率避免误回收,或改用Redis/Memcached存储会话:
session.gc_probability = 1 session.gc_divisor = 10000 // 触发概率降至万分之一
- 适配手机后台的心跳机制
改用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); // 日志代码保持不变
- 确保会话正确启动
在validsessao.php开头添加会话启动逻辑:
if (session_status() == PHP_SESSION_NONE) { session_start(); }
内容的提问来源于stack exchange,提问作者Bruno
相关产品推荐
相关产品推荐

