我在我的在线测试管理系统中遇到了一个奇怪的问题。
有些用户在测试表单(test.php)中需要很长时间来回答问题并提交表单。
提交表单后,会话已过期,用户必须重新登录。
这不是代码问题。
我在所有页面的顶部设置了这个值。
ini_set('session.gc_maxlifetime', 18000);
有没有一种方法可以在测试表单中不重新加载页面的情况下每10分钟刷新会话以防止会话过期?
请帮帮我。
谢谢。
我在我的在线测试管理系统中遇到了一个奇怪的问题。
有些用户在测试表单(test.php)中需要很长时间来回答问题并提交表单。
提交表单后,会话已过期,用户必须重新登录。
这不是代码问题。
我在所有页面的顶部设置了这个值。
ini_set('session.gc_maxlifetime', 18000);
有没有一种方法可以在测试表单中不重新加载页面的情况下每10分钟刷新会话以防止会话过期?
请帮帮我。
谢谢。
你可以使用JavaScript XHR,或者其他人称之为AJAX。
使用AJAX可以调用一个PHP脚本,每10分钟刷新一次您的会话。 :)
这就是我能做到的“精确”程度。
JavaScript
var refreshSn = function ()
{
var time = 600000; // 10 mins
setTimeout(
function ()
{
$.ajax({
url: 'refresh_session.php',
cache: false,
complete: function () {refreshSn();}
});
},
time
);
};
// Call in page
refreshSn()
刷新会话的refresh_session.php
<?php
session_start();
// store session data
if (isset($_SESSION['id']))
$_SESSION['id'] = $_SESSION['id']; // or if you have any algo.
?>
session_start()
就足够了吗? - lorenzo-ssetInterval(function(){$.post('path/to/refresh_session.php');},600000);
- myfunkysidesetInterval(function(){
$.post('path/to/refresh_session.php');
},600000); //refreshes the session every 10 minutes
refresh_session.php
<?php
session_start();
// if you have more session-vars that are needed for login, also check
// if they are set and refresh them as well
if (isset($_SESSION['token'])) {
$_SESSION['token'] = $_SESSION['token'];
}
?>
额外信息
虽然我认为在php中只调用session_start()
就足够了,但如果我理解正确(https://www.php.net/function.session-start):
读取回调函数将检索任何现有的会话数据(以特殊的序列化格式存储),并在读取回调函数返回保存的会话数据时进行反序列化,并自动填充$_SESSION超全局变量,以供PHP会话处理使用。
在测试期间,我只在我的访客页面上放置了上述代码,而没有放在管理员页面上。但我在同一个浏览器(Chrome)中同时打开了这两个页面,管理员页面也保持登录状态,至少持续了一个小时(没有检查更长时间)。
但是,我不知道如果只使用session_start()
而不手动刷新任何会话变量,它是否仍然有效。
无论如何,我希望确保我需要的会话变量确实仍然存在:)
Javascript:
function doStayAlive() {
var request = new XMLHttpRequest();
request.open('GET', 'stayalive.php', true);
request.send();
}
timerStayAlive = setInterval(doStayAlive, 600000); // 10 minutes
<?php
session_start();
http_response_code(204);
?>
不需要“触碰”会话变量